docker實戰筆記
一、安裝docker
下面以ubuntu系統舉例:
卸載已有的舊版本docker
$ sudo apt-get remove docker \
docker-engine \
docker.io
使用apt安裝最新版docker
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
更新apt軟體包快取
$ sudo apt-get update
# 安裝docker-ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
啟動docker
# 使用系統命令啟動docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
建立docker用戶組
默認情況下,docker 命令會使用 Unix socket 與 Docker 引擎通訊,而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket,出于安全考慮,一般 Linux 系統上不會直接使用 root 用戶,因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組
# 建立docker用戶組
$ sudo groupadd docker
# 將用戶加入到docker用戶組中
$ sudo usermod -aG docker [$USER 用戶名]
二、docker鏡像【重要】
鏡像是 Docker 的三大組件之一,
Docker 運行容器前需要本地存在對應的鏡像,如果本地不存在該鏡像,Docker 會從鏡像倉庫下載該鏡像,
【重點】
docker鏡像與docker容器的區別
? 鏡像的一個實體稱為容器, 你有一個鏡像,這是你描述的一組圖層, 如果你開始這個鏡像,你有一個運行這個鏡像的容器, 您可以擁有許多相同鏡像的正在運行的容器,
# 查看所有鏡像
docker images
# 查看正在運行的容器
docker ps -a
獲取鏡像
$ docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標簽]
# 指定ubuntu版本下載
docker pull ubuntu:18.04
# 下載Ubuntu所有鏡像
docker pull -a ubuntu
# 下載centos所有鏡像
docker pull -a centos
docker互動式
// 進入docker互動式 用法和linux命令類似
docker run -it --rm ubuntu bash
列出鏡像
docker image ls
查看鏡像檔案大小
docker system df
洗掉本地鏡像
$ docker image rm [選項] <鏡像1> [<鏡像2> ...]
使用commit理解鏡像
docker commit 命令除了學習之外,還有一些特殊的應用場合,比如被入侵后保存現場等,但是,不要使用 docker commit 定制鏡像,定制鏡像應該使用 Dockerfile 來完成,
簡單來說docker commit就是在原來的鏡像上面進行copy然后形成新的鏡像
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]
# 栗子:
$ docker commit \
--author "Tao Wang <[email protected]>" \
--message "修改了默認網頁" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內容,這點和 git 版本控制相似,不過這里這些資訊可以省略留空,
三、使用dockerfile制作鏡像
? 從剛才的 docker commit 的學習中,我們可以了解到,鏡像的定制實際上就是定制每一層所添加的配置、檔案,如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決,這個腳本就是 Dockerfile
Dockerfile 是一個文本檔案,其內包含了一條條的 指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建,
創建dockerfile
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
# 寫入腳本
FROM nginx // 指定鏡像
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM命令
? 所謂定制鏡像,那一定是以一個鏡像為基礎,在其上進行定制,就像我們之前運行了一個 nginx 鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的,而 FROM 就是指定 基礎鏡像,因此一個 Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令,
RUN命令
? RUN 指令是用來執行命令列命令的,由于命令列的強大能力,RUN 指令在定制鏡像時是最常用的指令之一,其格式有兩種
-
shell 格式:
RUN <命令>,就像直接在命令列中輸入的命令一樣,剛才寫的 Dockerfile 中的RUN指令就是這種格式,# 執行腳本 單個 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html -
exec 格式:
RUN ["可執行檔案", "引數1", "引數2"],這更像是函式呼叫中的格式,FROM debian:stretch # 批量執行腳本 RUN apt-get update RUN apt-get install -y gcc libc6-dev make wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install
exec格式雖然是批量執行腳本,但是上面腳本創建了七層鏡像,是不合適的,那么正確的寫法是: 使用&&符號進行連接,把原來創建七層鏡像變成了一層
FROM debian:stretch
# '\'是shell腳本的末尾換行符
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
3.1、dockerfile指令詳解【重要】
FORM指令
FROM 系統[:鏡像版本號]
# 指定基礎鏡像,也是必須的!!!
FROM ubuntu
EXPOSE指令
EXPOSE 指令是宣告容器運行時提供服務的埠,這只是一個宣告,在容器運行時并不會因為這個宣告應用就會開啟這個埠的服務,在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護埠,以方便配置映射;另一個用處則是在運行時使用隨機埠映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的埠,
# 指定 80埠命令
EXPOSE 80
RUN指令
# 指定下載安裝包并更新軟體包快取
RUN apt-get -qq update
COPY復制檔案
COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
# 復制/home/test檔案夾下所有檔案到當前目錄
COPY /home/test/** .
CMD指令
CMD 指令的格式和 RUN 相似,也是兩種格式:
shell 格式:CMD <命令>
# 栗子:
CMD echo 'hello world!'
CMD service nginx start
exec 格式:CMD ["可執行檔案", "引數1", "引數2"...]
引數串列格式:CMD ["引數1", "引數2"...],在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的引數,
ENV指令
格式有兩種:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 栗子:
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
ADD復制檔案(高級用法)
# 與COPY指令類似,復制某個檔案夾下所有檔案到/mydir
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/
總結:
# FROM:作為基礎鏡像
FROM ubuntu
# 使用RUN指令下載安裝包等等,連接使用&&
RUN apt-get -qq update \
&& COPY /home/test/** . \
# EXPOST 8080
&& RUN echo 'hello, dockerfile'
那么鏡像制作完成了,就應該進行構建鏡像
# docker build -t=【tag資訊】 【dockerfile路徑】
docker build [選項] <背景關系路徑/URL/->
# 栗子:
docker build -t nginx:v3 .
四、操作容器
新建并啟動一個容器
# 使用docker run命令攜帶腳本
$ docker run ubuntu /bin/echo 'Hello world'
Hello world
查看正在運行的docker容器資訊
# 查看容器資訊
docker container ls
查看容器日志【重要】
# 查看正在運行的容器
docker ps -a
# 拿到對應的容器id,使用docker logs 查看日志
docker container logs [container ID or NAMES]
# 查看實時日志
docker logs -f [container ID or NAMES]
操作容器(停止、啟動、重啟)
# 1.查看正在運行的容器
docker ps -a
# 2.停止正在運行的容器
docker container stop [容器id]
# 3.啟動正在運行的容器
docker container start [容器id]
# 4.重啟正在運行的容器
docker container restart [容器id]
進入容器
# 命令
docker attach [容器id] / docker exec [容器id]
# 進入容器并啟用偽裝終端
docker exec -it [容器id] bash
匯入匯出容器
# 1.查看容器
docker container ls -a
# 2.匯出容器到本地檔案
docker export [容器id] > ubuntu.tar
# 3.匯入容器
docker import [目錄/http鏈接]
洗掉容器
# 1.查看所有容器
docker container ls
# 2.停止對應容器
docker container stop [容器id]
# 3. 洗掉對應容器
docker container rm [容器id / 容器名]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545554.html
標籤:其他
下一篇:跟著廖雪峰學python 006
