docker 的部署與快速使用,首先,容器是每個用戶個人使用的,鏡像是提前部署好的,用戶根據鏡像,建立自己的容器進行開發使用。容器內部是獨立的
1. 閱讀須知
本文檔介紹瞭如何在宿主機系統上進行 Docker 服務的部署,以及如何創建 Docker 鏡像、
如何創建並運行 Docker 容器等,本文檔的測試環境所用的宿主機系統是 Ubuntu16.04,具體信息如下。
$ uname -a
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017
x86_64 x86_64 x86_64 GNU/Linux
部署完成的 Docker 版本是 19.03.11。
$ docker --versi
Docker version 19.03.11, build 42e35e61f3
2. 部署
使用的話,可以直接看最後一章
2.1 安裝 Docker 及相關軟件包
① 如果從 Ubuntu 官方的源下載速度慢,可嘗試把源更換爲清華源
# 先備份原來的 source.list 文件。
$ sudo cp /etc/apt/source.list /etc/apt/source.list.b
# 打開 source.list 文件添加以下內容
$ sudo vi /etc/apt/source.li
② 安裝 https 相關的軟
$ sudo apt-get update
$ sudo apt-get install apt-transport-https
$ sudo apt-get install ca-certificates
$ sudo apt-get install curl
$ sudo apt-get install software-properties-common
③ 設置 Docker 的 apt 倉庫地址
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -3
$ sudo add-apt-repository "deb [arch=amd64] \ https://download.docker.com/linux/ubuntu \
$ (lsb_release -cs) \ stable"
# 如果長時間無響應,可嘗試把源更換爲清華源
④ 安裝 Docker 軟件包
$ sudo apt-get install docker-ce
⑤ 測試 Docker 服務是否已部署成功
$ sudo docker run hello-world
2.2 查看安裝完成的 Docker 版本
$ docker --version
Docker version 19.03.9, build 9d988398e7
2.3 創建 Docker 用戶組並添加到當前用戶的附加羣組
此步主要解決運行 Docker 命令時需要 sudo 權限的問題
# 創建新的用戶組 docker
$ sudo groupadd docker
# 添加用戶組 docker 到用戶 clare 的附加羣組
$ sudo usermod -aG docker clare
# 查看 docker 用戶組是否已添加到用戶 clare 的附加羣組
$ cat /etc/group |grep docker
docker:x:999:clare
# 退出用戶,重新登錄使以上配置生效
$ logout
2.4 停止和開啓 Docker 服務
默認情況下 Docker 服務會自啓。手動停止和開啓 Docker 服務可參考以下命令
# 開啓 Docker 服務
$ sudo service docker start
# 停止 Docker 服務。注意:Docker 服務一旦停止,所有的容器也會停止
$ sudo service docker stop
# 重啓 Docker 服務。
$ sudo service docker restart
3. Docker 鏡像常用命令
3.1 從 Docker 倉庫拉取鏡像
# 運行以下命令會從 Docker 倉庫拉取 Ubuntu16.04 鏡像到本地
$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
e92ed755c008: Pull complete
b9fd7cb1ff8f: Pull complete
ee690f2d57a1: Pull complete
53e3366ec435: Pull complete
Digest:
sha256:db6697a61d5679b7ca69dbde3dad6be0d17064d5b6b0e9f7be8d456ebb337209
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04
注:Usage: docker pull <REPOSITORY:TAG>
Docker 中鏡像名是由倉庫名 REPOSITORY 和標籤名 TAG 組成。
3.2 查看本地上已有的 Docker 鏡像
$ docker images
3.3 刪除本地上的一個 Docker 鏡像
$ docker rmi hello-world:latest
注:Usage: docker rmi IMAGE
docker rmi 後指定要刪除的鏡像,可以是鏡像名 REPOSITORY:TAG,也可以是鏡像
的 IMAGE ID。
3.4 使用 Dockerfile 創建自定義 Docker 鏡像
① 編寫 Dockerfile
$ touch Dockerfile
$ vi Dockerfile
# 添加以下內容到 Dockerfile 中,基於 Ubuntu16.04 鏡像創建新的鏡像,並安裝
# 常用的 vim、ifconfig 等命令依賴的軟件包。
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get -y install sudo vim net-tools iputils-ping openssh-server \
git curl unzip samba nfs-kernel-server nfs-common minicom
CMD /bin/bash
注:以上僅僅是一個簡單的 Dockerfile 模板,可根據具體需求繼續添加命令(如添加
所需軟件包到 apt-get -y install 之後)。
② 根據 Dockerfile 創建鏡像
# 使用當前目錄下的 Dockerfile 創建新鏡像:ubuntu_clare:16.04_20200604
$ docker build -t ubuntu_clare:16.04_20200604 ./
$ docker images
注:Usage: docker build -t <REPOSITORY:TAG> DOCKERFILE_PATH
1. docker build 命令中 -t <REPOSITORY:TAG> 的作用是指定創建的鏡像名。
2. docker build 命令中 DOCKERFILE_PATH 是指定的 Dockerfile 所在目錄。
3.5 打包保存 Docker 鏡像
# 將名稱爲 ubuntu_atu:16.04_20200604 的 Docker 鏡像打包在 image.tar 中。
$ docker save -o image.tar ubuntu_atu:16.04_20200604
$ ls -lh image.tar
注:Usage: docker save -o ARCHIVE_NAME <REPOSITORY:TAG>
1. docker save 命令中 -o ARCHIVE_NAME 的作用是指定打包保存到哪個文件。
2. docker save 命令中 -o <REPOSITORY:TAG> 的作用是指定打包保存的鏡像名。
3.6 加載 Docker 鏡像包
# 加載當前目錄下的 Docker 鏡像包 image.tar。
$ docker load -i image.tar
注:Usage: docker load -i ARCHIVE_NAME
1. docker load 命令中 -i ARCHIVE_NAME 的作用是指定加載的鏡像包文件名。
2. 注意:運行命令加載鏡像包中的鏡像後,會覆蓋本地鏡像庫中已有的同名鏡像。
4. Docker 容器常用命令
1.1 創建 Docker 容器
運行 docker run 命令會創建並運行一個新的 Docker 容器。
# 基於鏡像 ubuntu_atu:16.04_20200604 創建名稱爲 ubuntu16.04_felix 的容器,
# 設置容器中的 Ubuntu 系統 hostname 爲 ubuntu16,並掛載指定的宿主機目錄
# /home/felix 到容器中的 /home 目錄下。
$ docker run -it --name ubuntu16.04_felix --hostname ubuntu16 \
-v /home/felix:/home ubuntu_atu:16.04_20200604 /bin/bash
注:Usage: docker run -it --name CONTAINER --hostname HOSTNAME \
-v HOST_PATH:CONTAINER_PATH \
<REPOSITORY:TAG> [COMMAND]
1. docker run 命令中 -it 的作用是以交互模式(--interactive)運行容器並分配一個僞
串口(--tty)。
2. docker run 命令中 --hostname HOSTNAME 的作用是指定容器中 Ubuntu 系統的
hostname(會顯示在終端的 root@ 之後)。
3. docker run 命令中 -v HOST_PATH:CONTAINER_PATH 的作用是通過 bind mount
方式掛載宿主機目錄到容器中。掛載到容器中的位置 CONTAINER_PATH 建議是在
容器中的 /home 目錄下(可以是新建的子目錄)。
4. docker run 命令中最後的 COMMAND 是創建容器後自動運行的命令,一般是啓動
bash 的命令 /bin/bash。目的是讓容器創建後至少有一個正在運行的進程,否則容
器狀態會變成 Exited。
3.2 查看所有容器的狀態
Docker 容器的狀態一般有兩種:Up(容器正在運行)和 Exited(容器已經退出)。
# 顯示所有容器的信息。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
69ad94a86022 ubuntu_atu:16.04_20200604 "/bin/bash" About an hour ago
Up 1 second ubuntu16.04_felix
# 只顯示容器 ID、鏡像名、容器狀態和容器名。
$ docker ps -a --format "table{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
4.3 切換終端回到宿主機
在剛創建容器後運行的終端裏直接按 Ctrl + D 或運行 exit 命令會直接停止容器,容器中的
系統會停止運行。不停止容器的前提下切換終端回到宿主機的方法是:先按下 Ctrl + P,然
後按下 Ctrl + Q。
root@ubuntu16:/#
# 先按下 Ctrl + P,然後按下 Ctrl + Q。
root@ubuntu16:/# read escape sequence
# 接下來就會回到宿主機的終端
felix@atu:~$
4.4 切換終端回到正在運行的容器
$ docker exec -it ubuntu16.04_felix /bin/bash
root@ubuntu16:/#
注:Usage: docker exec -it CONTAINER /bin/bash
1. CONTAINER 可以是容器 ID 或者容器名。
2. 還有另一條命令 docker attach 也可以切換終端回到 Docker 容器,區別在於通過
docker attach 進入的容器,終端按下 Ctrl + D 或運行 exit 命令後,容器也會停
止。而通過 docker exec 進入的則不會
4.5 停止和啓動容器
$ docker stop ubuntu16.04_felix
$ docker start ubuntu16.04_felix
注:Usage: docker stop CONTAINER
docker start CONTAINER
CONTAINER 可以是容器 ID 或者容器名。
4.6 刪除容器
$ docker rm ubuntu16.04_felix
注:Usage: docker rm CONTAINER
刪除前先確認容器已停止(狀態是 Exited)。容器刪除後無法恢復,請謹慎執行
4.7 重命名容器
$ docker rename ubuntu16.04_felix ubuntu16.04_rename
$ docker ps -a
注:Usage: docker rename CONTAINER NEW_NAME
4.8 在宿主機和容器之間傳輸文件
如果在創建容器時已指定了掛載目錄,則只需把文件放到掛載的宿主機目錄下,容器中即可
直接訪問。如果沒有掛載,可以使用 docker cp 命令進行傳輸。
# 複製宿主機中的文件 filetest 到容器 ubuntu16.04_felix 的 /home 目錄下。
$ docker cp filetest ubuntu16.04_felix:/home
# 複製容器中的目錄 /home/dirtest/ 到宿主機的當前目錄。
$ docker cp ubuntu16.04_felix:/home/dirtest/ ./
注:Usage: docker cp SRC_PATH CONTAINER:DEST_PATH
docker cp CONTAINER:SRC_PATH DEST_PATH
在宿主機上使用 docker cp 命令既可以複製宿主機中的文件(或目錄)到容器,也可
以複製容器中的文件(或目錄)到宿主機。
4.9 保存容器爲新的鏡像
# 將名稱爲 ubuntu16.04_felix 的容器保存爲鏡像 ubuntu:16.04_v2_20200604。
$ docker commit ubuntu16.04_felix ubuntu_atu:16.04_v2_20200604
$ docker images
注:Usage: docker commit CONTAINER <REPOSITORY:TAG>
1. docker commit 命令中 CONTAINER 是需要保存的容器名。
2. docker commit 命令中 <REPOSITORY:TAG> 是指定保存成爲的鏡像名。
5. Docker 新用戶快速使用
通用腳本
#!/bin/bash
# This script would help you run a docker container quickly.
# example for input
# CONTAINER_NAME="ubuntu14.04"
# IMAGE_REPO="ubuntu"
# IMAGE_TAG="14.04"
# HOST_PATH="/home/xx/workspace"
# CONTAINER_PATH="/home/workspace"
# HOST_NAME="ubuntu14"
echo
echo "This script would help you run a docker container quickly."
echo
echo "You can refer to the following existing container:"
echo "(NOTICE: a new container name is required to be different)"
echo
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.CreatedAt}}"
echo
read -e -p "1. input a NEW container name : " CONTAINER_NAME
echo
echo
echo "You can run a container based on one of the following image:"
docker images
echo
read -e -p "2. input based image REPOSITORY : " IMAGE_REPO
read -e -p "3. input based image TAG : " IMAGE_TAG
echo
read -e -p "4. input mount host path : " HOST_PATH
read -e -p "5. input mount container path : " CONTAINER_PATH
echo
read -e -p "6. input container's host name : " HOST_NAME
echo
echo
echo "Please check the follow information for your new container:"
echo "1. container name : $CONTAINER_NAME"
echo "2. image repository : $IMAGE_REPO"
echo "3. image tag : $IMAGE_TAG"
echo "4. host path : $HOST_PATH"
echo "5. container path : $CONTAINER_PATH"
echo "6. host name : $HOST_NAME"
echo
echo
read -e -p "Want to run a docker container? [Y/n] " input
case $input in
[nN])
echo
echo "abort running docker container."
echo
exit 1
;;
*)
echo
echo "start running your docker container, please wait..."
echo
echo
;;
esac
# Create an user account in container.
# The user name and uid are the same as the account on host.
USER_NAME=$USER
USER_ID=$(id -u $USER)
echo "create user name of $USER_NAME and uid of $USER_ID."
echo
echo -n "new container id: "
# Run backaround using "-d".
docker run -tid --name ${CONTAINER_NAME} \
--hostname ${HOST_NAME} \
-v ${HOST_PATH}:${CONTAINER_PATH} \
${IMAGE_REPO}:${IMAGE_TAG} \
/bin/bash
echo
echo
echo "now enter to the shell of container..."
echo "(TIPS: press Ctrl + P and then Ctrl + Q to leave the shell of container)"
echo
echo
echo "NOTICE:"
echo
echo "1. please set password for $USER first, using [passwd $USER]."
echo
echo "2. after setting password, please switch the accout to $USER using [su $USER]."
echo
echo
# Create a user account using the CURRENT user name and uid.
docker exec ${CONTAINER_NAME} useradd -u $USER_ID -m $USER_NAME --shell /bin/bash
# Add to the sudo group.
docker exec ${CONTAINER_NAME} usermod -G sudo $USER_NAME
# Enter the container.
docker exec -it ${CONTAINER_NAME} /bin/bash
本章面向 Docker 服務的使用者,主要介紹瞭如何通過 docker_run.sh 腳本在宿主機上快速創
建並運行一個自定義配置的 Docker 容器。
1. 運行腳本創建並運行容器
以下示例運行 docker_run.sh 腳本,主要完成以下功能:
① 創建並運行一個名稱爲 ubuntu16.04_felix 的容器。
② 該容器基於 ubuntu_atu:16.04_20200604 鏡像。
③ 運行後會在容器的 Ubuntu 系統中新建一個與當前用戶相同用戶名和 uid 的用戶。
④ 將指定的宿主機目錄 /home/felix/workspace/hisilicon/Hi3562V100/ 掛載到容器中指定
的目錄 /home/workspace 下。
⑤ 設置容器的 Ubuntu 系統的 hostname 爲 ubuntu16。
$ ./docker_run.sh
This script would help you run a docker container quickly.
You can refer to the following existing container:
(NOTICE: a new container name is required to be different)
CONTAINER ID NAMES IMAGE STATUS
CREATED AT
ef6d83e41c13 ubuntu14.04_felix ubuntu_atu:14.04_20200604 Up 14 minutes
2020-06-04 01:57:54 -0400 EDT
# 輸入新的容器名(請與已有的容器命名方式保持一致)。
1. input a NEW container name : ubuntu16.04_felix
# 輸入容器基於的鏡像所在倉庫名(從上表中查閱)
2. input based image REPOSITORY : ubuntu_atu
# 輸入容器基於的鏡像的標籤名(從上表中查閱)。
3. input based image TAG : 16.04
# 輸入要掛載到容器中的宿主機目錄。(因爲容器獨立,所以想使用外部的文件的話,需要將外部的文件夾掛載到容器中)
4. input mount host path : /home/felix/workspace/
# 輸入要掛載到容器中的目錄(建議掛載到 /home 目錄下,且不要和用戶名重名)
5. input mount container path : /home/workspace
# 輸入容器中系統的 hostname(建議和 Ubuntu 版本號一致,以便使用時區分開)
6. input container's host name : ubuntu16
# 檢查輸入信息是否有誤。如果有誤,可按 Ctrl + C 退出腳本,重新運行。
Please check the follow information for your new container:
1. container name : ubuntu16.04_felix
2. image repository : ubuntu_atu
3. image tag : 16.04_20200604
4. host path : /home/felix/workspace/hisilicon/Hi3562V100/
5. container path : /home/workspace
14
6. host name : ubuntu16
Want to run a docker container? [Y/n]
# 確認無誤後,按下 Enter 鍵開始創建並運行 Docker 容器
start running your docker container, please wait...
# 腳本會自動在容器中的系統創建一個新用戶,擁有與當前用戶相同的用戶名和 uid。
create user name of felix and uid of 1001.
new container id: 90d8082320cca05b8bb8e7570cfae3a0da40ebcf468954a048a2af42aaf9cdef
now enter to the shell of container...
(TIPS: press Ctrl + P and then Ctrl + Q to leave the shell of container)
NOTICE:
1. please set password for felix first, using [passwd felix].
2. after setting password, please switch the accout to felix using [su felix].
root@ubuntu16:/#
# 以下已進入到容器中的 Ubuntu 系統的終端。
root@ubuntu16:/#
# 爲容器中的新用戶設置密碼
root@ubuntu16:/# passwd felix
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# 切換到新用戶(一般情況下不要使用 root 用戶做開發)。
root@ubuntu16:/# su felix
# 驗證是否可以訪問宿主機掛載在容器上的目錄
felix@ubuntu16:/$ cd /home/workspace/
felix@ubuntu16:/home/workspace$ ls
注:1. docker images 顯示的 Docker 鏡像中,倉庫名(REPOSITORY)爲 ubuntu 的是
從 Docker 倉庫拉取下來的原始鏡像,倉庫名爲 ubuntu_atu 的是基於原始鏡像安裝
了一些常用命令所依賴的軟件包之後的鏡像。
2. 在進入到容器後,請先根據腳本的提示設置新用戶的密碼,並切換到新用戶下。由
於 Docker 容器中的用戶 ID 是和宿主機共用的,所以建議不要在 Docker 容器中
再創建新的用戶。
3. 使用容器時請不要登錄 root 用戶進行操作,特別是不要在 root 用戶下對掛載到容
器中的宿主機目錄進行操作。如果遇到必須使用 root 用戶才能執行的操作(比如
cd 進入根目錄下的某些目錄),可使用命令 sudo su 暫時切換到 root 用戶。
5.2 在容器和宿主機之間切換終端
# 按下 Ctrl + P,再按下 Ctrl + Q 可以切換終端回到宿主機
felix@ubuntu16:/host$ read escape sequence
felix@atu:~$
# 回到正在運行的容器(以新建的普通用戶 felix 進入)
felix@atu:~$ docker exec -it -u felix ubuntu16.04_felix /bin/bash
felix@ubuntu16:/#
6. 參考資料
葉正軒的 docker 搭建筆記