Docker 服務部署和使用

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 搭建筆記

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章