docker實戰筆記 一、安裝docker 下麵以ubuntu系統舉例: 卸載已有的舊版本docker $ sudo apt-get remove docker \ docker-engine \ docker.io 使用apt安裝最新版docker $ sudo apt-get update $ ...
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 / 容器名]