【原創】docker在Ubuntu下1小時快速學習
前言
由於工作原因,很多情況下需要快速學習新的知識,針對docker如果從頭到尾看相關書籍學習會非常慢,所以整理了下docker的常用操作,只要跟著本文學習操作,一小時就能掌握docker大部最常用分操作方法,也可以當做工具手冊隨時查詢學習,當然本文未涉及的部分,還是需要通過閱讀書籍學習,這文章的目的是幫助需要快速上手應用的人。由於寫該文章的時候還比較早,所以所用系統和docker版本比較早,但是基本上其他版本操作基本一致,就不在重新更換版本重新編寫。
一、 Ubuntu 14.0.4系統安裝docker
1.1 線上安裝docker
以下操作步驟均在root使用者下操作
1 | 檢查核心是否符合要求 | Docker 要求 Ubuntu 系統的核心版本高於 3.10 ,建議在 Ubuntu14.04 版本
root@duke:/var/cache/apt/archives# uname -r |
2 | 安裝docker |
root@duke:~# wget -qO- https://get.docker.com/ | sh + sh -c apt-get install -y -qq apt-transport-https ca-certificates curl software-properties-common >/dev/null + sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null + sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu trusty edge" > /etc/apt/sources.list.d/docker.list + sh -c apt-get update -qq >/dev/null + sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null + sh -c docker version Client: Version: 17.11.0-ce API version: 1.34 Go version: go1.8.3 Git commit: 1caf76c Built: Mon Nov 20 18:36:37 2017 OS/Arch: linux/amd64 Server: Version: 17.11.0-ce API version: 1.34 (minimum version 1.12) Go version: go1.8.3 Git commit: 1caf76c Built: Mon Nov 20 18:35:10 2017 OS/Arch: linux/amd64 Experimental: false If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like: sudo usermod -aG docker your-user Remember that you will have to log out and back in for this to take effect! 當要以非root使用者可以直接執行docker時,需要執行 sudo usermod -aG docker runoob 命令,然後重新登陸,否則會有如下報錯 WARNING: Adding a user to the "docker" group will grant the ability to run containers which can be used to obtain root privileges on the docker host. Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface for more information. |
3 | 啟動docker 後臺服務 |
root@duke: service docker start |
4 | 測試執行hello-world |
root@duke: docker run hello-world |
【注意】:如果在sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null這步失敗時,報以下錯誤:
E: 無法下載 https://download.docker.com/linux/ubuntu/dists/trusty/pool/edge/amd64/docker-ce_17.11.0~ce-0~ubuntu_amd64.deb Operation too slow. Less than 10 bytes/sec transferred the last 120 seconds
可以先利用工具下載docker-ce_17.11.0~ce-0~ubuntu_amd64.deb,下好後,將docker-ce_17.11.0~ce-0~ubuntu_amd64.deb放入/var/cache/apt/archives
目錄即可。
1.2 修改docker預設儲存路徑
Docker使用會佔用大量的磁碟空間。預設的儲存路徑是/var/lib/docker/
,一般情況下/var/lib/路徑是系統預設磁碟容量空間不會很大, 所以會造成docker佔用磁碟滿的問題產生。所以在安裝好docker後,最好第一時間修改docker的預設儲存路徑。
-
檢視docker當前配置
docker info
root@duke-211:/etc/systemd/system/docker.service.d# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.03.2-ce
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.10.0-28-generic
Operating System: Ubuntu 16.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 62.83 GiB
Name: duke-211
ID: IPDB:XJ53:E2RU:ML3E:BA4G:FQBL:GBSW:SBM5:M3PA:JI3G:A2TW:NPKO
Docker Root Dir: /var/lib/docker 需要修改該路徑
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: falseWARNING: No swap limit support
-
建立docker配置目錄(下面是ubuntu16.04的系統環境命令)
mkdir -p /etc/systemd/system/docker.service.d
-
新增docker配置檔案(下面是ubuntu16.04的系統環境命令)
root@duke-211:/data1/docker# cd /etc/systemd/system/docker.service.d
root@duke-211:/etc/systemd/system/docker.service.d# vi docker-overlay.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph="/home/docker" --storage-driver=overlay -
停止docker
service docker stop
-
過載docker配置
systemctl daemon-reload
-
啟動docker
service docker start
-
檢視docker當前配置
root@duke-211:/etc/systemd/system/docker.service.d# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.03.2-ce
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.10.0-28-generic
Operating System: Ubuntu 16.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 62.83 GiB
Name: duke-212
ID: OAIE:B5FM:CLEF:G4YS:DNDS:NSKV:JE26:JZYL:GOY3:DDLI:JGDV:OFHX
Docker Root Dir: /home/docker 已經完成儲存目錄修改
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: falseWARNING: No swap limit support
二、 Docker使用非root使用者
通常我們使用Docker的時候都是使用的root,官方說法如下:
The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can access it with sudo. For this reason, docker daemon always runs as the root user.
To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
下面是使用非root使用者操作的步驟:
- 建立docker組
sudo groupadd docker
- 將當前使用者加入docker組
sudo gpasswd -a ${USER} docker
- 重新啟動docker服務(下面是CentOS7的命令)
sudo systemctl restart docker
- 當前使用者退出系統重新登陸
- 執行docker命令
docker ps
三、 映象
以下操作步驟均在root使用者下操作
3.1 映象查詢
- 映象可以自己做,也可以從官方直接下載,在https://hub.docker.com就可以直接查詢下載
- 也可以直接使用docker命令進行映象查詢如下表(例:不截斷資訊的搜尋14.04.1的映象),命令如下:
docker search --no-trunc=true 14.04.1
執行過程如下:root@duke:/var/cache/apt/archives# docker search --no-trunc=true 14.04.1 NAME DESCRIPTION STARS OFFICIAL AUTOMATED linode/lamp LAMP on Ubuntu 14.04.1 LTS Container 121 araczkowski/oracle-apex-ords Oracle Express Edition 11g Release 2 on Ubuntu 14.04.1 LTS with APEX 5 and ORDS 13 [OK] b7alt/drupal Drupal >= 7.34 already installed, SQLite on Nginx, APC, SSH, drush, Ubuntu 14.04.1 LTS 5 [OK] densuke/trusty-jp [Obsoleted] Ubuntu Linux 14.04LTS(14.04.1)に日本語の風味を付けておきました 3 [OK] matriphe/ubuntunginxphp Ubuntu 14.04.1 (phusion/baseimage-docker) with Nginx and PHP. 1 [OK] zsoltm/ubuntu-armhf Ubuntu 14.04.1 minimal install, latest updates for ARMv7 (armhf)
3.2 本地映象檢視
命令如下:
docker images
執行過程如下:
root@duke:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest f2a91732366c 6 days ago 1.85kB ubuntu 14.04 d6ed29ffda6b 9 days ago 221MB
3.3 映象新增標籤
映象可以新增多個標籤,可以理解為映象別名,新增標籤的映象,並沒有新生成映象,只是生成了一個新的連線,就像linux中的ln命令一樣,具體操作命令如下:
root@duke:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 7 days ago 1.85kB
ubuntu 14.04 d6ed29ffda6b 10 days ago 221MB
registry latest a07e3f32a779 3 weeks ago 33.3MB
root@duke:~# docker tag ubuntu:14.04 10.0.0.76:5000/test_registry
root@duke:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 7 days ago 1.85kB
ubuntu 14.04 d6ed29ffda6b 10 days ago 221MB
10.0.0.76:5000/test_registry latest d6ed29ffda6b 10 days ago 221MB
registry latest a07e3f32a779 3 weeks ago 33.3MB
四、 容器
4.1 建立容器
root@duke:~# docker run -it ubuntu:14.04 bash 該命令是啟動+建立容器 root@ef664677b896:/# ping localhost PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.054 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.026 ms ^C --- localhost ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.026/0.040/0.054/0.014 ms root@ef664677b896:/# root@ef664677b896:/# ssh bash: ssh: command not found root@ef664677b896:/# exit 退出容器偽終端,相應的容器也會被終止執行 exit root@duke:~#
4.2 檢視容器
root@duke:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 21 minutes ago Exited (127) 2 minutes ago elegant_newton d97b7dc8aadd hello-world "/hello" 2 hours ago Exited (0) 2 hours ago thirsty_jackson
4.3 刪除容器
root@duke:~# docker rm d97b7dc8aadd d97b7dc8aadd root@duke:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" About an hour ago Exited (127) 27 minutes ago elegant_newton
有時候會存在大量退出狀態的容器,可以使用以下幾個方法刪除:
-
方法一:
查詢所有的容器,過濾出Exited狀態的容器,列出容器ID,刪除這些容器sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`
-
方法二:
刪除所有未執行的容器(已經執行的刪除不了,未執行的就一起被刪除了)sudo docker rm $(sudo docker ps -a -q)
-
方法三:
根據容器的狀態,刪除Exited狀態的容器sudo docker rm $(sudo docker ps -qf status=exited)
-
方法四(官方):
Docker 1.13版本以後,可以使用 docker containers prune 命令,刪除孤立的容器。sudo docker container prune
4.4 終止容器
root@duke:/var/run# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 2 hours ago Up 4 seconds elegant_newton root@duke:/var/run# docker stop ef664677b896 ef664677b896 root@duke:/var/run# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 2 hours ago Exited (0) 47 seconds ago elegant_newton
4.5 啟動容器
root@duke:/var/run# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 2 hours ago Exited (127) 2 hours ago elegant_newton root@duke:/var/run# docker start ef664677b896 ef664677b896 root@duke:/var/run# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 2 hours ago Up 4 seconds elegant_newton
4.6 進入容器
root@duke:/var/run# docker exec -it ef664677b896 /bin/bash root@ef664677b896:/# hostname ef664677b896 root@ef664677b896:/# exit exit root@duke:/var/run# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef664677b896 ubuntu:14.04 "bash" 2 hours ago Up 31 seconds
4.7 匯出容器
root@duke2:/data1/duke/docker/container# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9e7b88c5b99 ubuntu14.04-cn-ssh-vim:0.1 "/run.sh" 44 hours ago Up 44 hours 0.0.0.0:30001->22/tcp ubuntu14.04-cn-ssh-vim 68b9abed5bf8 flyceek/centos7-ssh "/usr/sbin/sshd -D" 2 days ago Up 2 hours 0.0.0.0:30002->22/tcp centos7-ssh b7f4b7a70d99 ubuntu:14.04 "bash" 3 days ago Up 47 hours festive_brown root@duke2:/data1/duke/docker/container# docker export 68b9abed5bf8 > centos7-ssh.tar root@duke2:/data1/duke/docker/container# ls centos7-ssh.tar
4.8 匯入容器
root@duke172:/data/docker/container# docker import centos7-ssh.tar centos7-ssh:v0.1 sha256:df1bf065ea466b18c32ac4c5492497d4622f8e477cffa216e65078986f4f56d3 root@duke172:/data/docker/container# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos7-ssh v0.1 df1bf065ea46 6 seconds ago 3.37GB
五、倉庫
前面章節下載的映象都來自於hup.docker.com的公共映象倉庫,docker實際上還提供了本地映象倉庫,用於存放自建的映象或者是從公共倉庫中下載的映象。
5.1 建立本地倉庫
從公共倉庫下載registry
映象,將會自動搭建本地私有倉庫。
預設建立倉庫命令如下,此時將會將倉庫建立在容器的/tmp/registry
下:
root@duke:~# docker run -d -p 5000:5000 registry
如果要指定倉庫的存放目錄
,就可以使用-v
引數來進行路徑指定,命令如下:
root@duke:~# docker run -d -p 5000:5000 -v /home/docker/registry:/tmp/registry registry Unable to find image 'registry:latest' locally latest: Pulling from library/registry 49388a8c9c86: Pull complete e4d43608dd22: Pull complete 3a41740f900c: Pull complete e16ef4b76684: Pull complete 65f212f7c778: Pull complete Digest: sha256:d837de65fd9bdb81d74055f1dc9cc9154ad5d8d5328f42f57f273000c402c76d Status: Downloaded newer image for registry:latest 8893ffeb80dd5746453cfa6ed43f29d0bb640de607d94fef0f31ea080ad15fb7
本地倉庫建立完成後,會自動啟動5000
的監聽埠。
5.2 驗證本地倉庫
在能夠連線本地映象伺服器的瀏覽器中輸入http://10.0.0.76:5000/v2/
進行登入檢視,返回json資料就表示安裝成功
【注意】:
本地倉庫是存在版本的
當前下載的倉庫映象版本為V2
因此網上使用http://10.0.0.76:5000/v1的檢視方式是無法生效的,只會返回404 page not found錯誤
5.3 上傳映象到本地倉庫
將自己別名的映象上傳到本地倉庫(必須使用tag別名私有倉庫地址字首,否則無法上傳到私有映象庫)
,操作如下:
root@duke:~# docker push 10.0.0.76:5000/test_registry The push refers to repository [10.0.0.76:5000/test_registry] Get https://10.0.0.76:5000/v2/: http: server gave HTTP response to HTTPS client root@duke:~#
但是在上述命令中報錯,資訊為:
Get https://10.0.0.76:5000/v2/: http: server gave HTTP response to HTTPS client
這個問題可能是由於客戶端採用https,docker registry未採用https服務所致。
處理方式是把客戶對地址“10.0.0.76:5000”請求改為http。【修改方法】:
1、在docker1.12.3以前的版本,修改docker的配置檔案/etc/systemconfig/docker
,重啟docker來解決這個問題。
2、在docker1.12.3以後的版本,在/etc/docker/
目錄下,建立daemon.json
檔案。在檔案中寫入{ "insecure-registries":["10.0.0.76:5000"] }
,儲存退出後,重啟docker。
操作步驟如下:
序列 | 操作步驟 | |
---|---|---|
1 | 新增配置 |
root@duke:~# vim /etc/docker/daemon.json |
2 | 重啟docker |
root@duke:~# service docker restart |
3 | 檢視容器狀態 |
root@duke:~# docker ps -a |
4 | 啟動本地倉庫容器 |
root@duke:~# docker start 8893ffeb80dd |
5 | 上傳映象到本地倉庫 |
root@duke:~# docker push 10.0.0.76:5000/test_registry |
5.4 檢視本地倉庫映象
【檢視方式一】:
root@duke:~# curl http://10.0.0.76:5000/v2/_catalog {"repositories":["test_registry"]} root@duke:~# curl http://10.0.0.76:5000/v2/test_registry/tags/list {"name":"test_registry","tags":["latest"]}
【檢視方式二】:
在能夠連線本地映象伺服器的瀏覽器中輸入http://10.0.0.76:5000/v2/_catalog進行登入檢視,返回json資料就表示安裝成功,如下圖:
詳細 curl 操作docker倉庫,見官方文件
5.5 下載本地倉庫映象
序列 | 操作步驟 | |
---|---|---|
1 | 檢視本地映象 |
root@duke:~# docker images |
2 | 刪除已經存在的映象 |
root@duke:~# docker rmi 10.0.0.76:5000/test_registry |
3 | 檢視本地映象 |
root@duke:~# docker images |
4 | 檢視容器狀態 |
root@duke:~# docker ps -a |
5 | 啟動本地倉庫容器 |
root@duke:~# docker start 8893ffeb80dd |
6 | 從本地倉庫下載映象 |
root@duke:~# docker pull 10.0.0.76:5000/test_registry |
7 | 檢視映象是否下載 |
root@duke:~# docker images |
5.6 設定本地倉庫安全校驗
由於有的新版本的docker對安全性要求較高,所以需要倉庫支援SSL/TLS的證書,對於內部使用的私有倉庫,可以自行配置證書,或者關閉倉庫的安全檢驗。
倉庫關閉證書校驗方法如下:
序列 | 操作步驟 | |
---|---|---|
1 | 修改配置 |
root@duke:~# vi /etc/docker/daemon.json |
2 | 重啟docker |
root@duke:~# service docker restart |
六、建立映象--開機啟動ssh
以下操作步驟均在root使用者下操作,執行以下命令:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視容器狀態 |
root@duke:~# docker ps -a |
2 | 啟動容器 |
root@duke:~# docker start ef664677b896 |
3 | 進入容器 |
root@duke:~# docker exec -it ef664677b896 /bin/bash |
4 | 安裝ssh |
root@ef664677b896:/# ssh |
5 | 使用ssh遠端登陸 |
root@ef664677b896:/# ssh [email protected] |
6 | 建立ssh目錄 |
建立/var/run/sshd目錄,該目錄必須存在 |
7 | 啟動ssh |
root@ef664677b896:/#/usr/sbin/sshd -D & |
8 | 修改root密碼 |
root@ef664677b896:/#passwd root |
9 | 修改pam限制 |
root@ef664677b896:/#sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd |
10 | 修改ssh配置檔案 |
註釋PermitRootLogin without-password root@ef664677b896:/# vi /etc/ssh/sshd_config |
11 | 新建容器啟動執行指令碼 |
root@ef664677b896:/#cd / 必須在 / 目錄下建立執行指令碼 |
12 | 退出容器 |
root@ef664677b896:/# exit |
13 | 生成包含ssh功能的映象 |
root@duke:~# docker commit -m "ubuntu 14.04 add ssh service" -a "hzw-duke" ef664677b896 ubuntu14.04-ssh:0.1 |
14 | 檢視映象庫 |
root@duke:~# docker images |
七、 存出鏡像
以下操作步驟均在root使用者下操作,執行以下命令:
方法1:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象 |
root@duke:~# docker images |
2 | 存出鏡像 |
root@duke:~# docker save ubuntu14.04-ssh > ubuntu14.04-ssh.tar |
3 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
方法2:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象 |
root@duke:~# docker images |
2 | 存出鏡像 |
root@duke:~# docker save --output ubuntu14.04-ssh.tar ubuntu14.04-ssh |
3 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
方法3:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象 |
root@duke:~# docker images |
2 | 存出鏡像 |
root@duke:~# docker save -o ubuntu14.04-ssh.tar ubuntu14.04-ssh |
3 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
方法4:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象 |
root@duke:~# docker images |
2 | 存出鏡像 |
root@duke:~# docker save -o ubuntu14.04-ssh.tar ubuntu14.04-ssh:0.1 |
3 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
八、 載入映象
以下操作步驟均在root使用者下操作,執行以下命令:
方法1:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
2 | 載入映象 |
root@duke:~# docker load --input ubuntu14.04-ssh.tar |
3 | 檢視映象 |
root@duke:~# docker images |
方法2:
序列 | 操作步驟 | |
---|---|---|
1 | 檢視映象包 |
root@duke:~# ls -alh ubuntu14.04-ssh.tar |
2 | 載入映象 |
root@duke:~# docker load < ubuntu14.04-ssh.tar |
3 | 檢視映象 |
root@duke:~# docker images |
九、 docker擁有root許可權
root@duke:~# docker run -it --privileged=true ubuntu:14.04
privileged
引數功能,設定為true
的時候,讓docker的root擁有真正root的許可權,可以呼叫宿主機硬體等,甚至可以讓你在docker中使用docker
十、 docker映象下載加速
由於官方映象下載非常緩慢,所以需要加速器進行加速下載,這樣的加速器很多,可以選擇下面加速器進行下載加速:
- 登陸到https://www.daocloud.io/mirror後,進行註冊
- 註冊後就能得到下面資訊
-
在宿主機上執行以下操作就能完成下載加速,命令如下:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8ad3346c.m.daocloud.io
執行過程如下:
root@duke:/opt# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8ad3346c.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://8ad3346c.m.daocloud.io"], "insecure-registries":["10.0.0.76:5000"] }
Success.
You need to restart docker to take effect: sudo systemctl restart docker.service
root@duke:/opt# service docker restart -
以上操作實際上就是
新增
或修改
了/etc/docker/daemon.json
檔案,資訊如下:root@duke:/etc/systemd# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://8ad3346c.m.daocloud.io"],
"insecure-registries":["10.0.0.76:5000"]
}"registry-mirrors": ["http://8ad3346c.m.daocloud.io"] 這個就是
加速地址
"insecure-registries":["10.0.0.76:5000"] 這個是本地倉庫地址
十一、 支援外部訪問docker容器
建立一個外部可以通過ssh訪問的docker並且支援和宿主機共享一個目錄資料夾的方法:
- 執行下面命令建立一個可以通過宿主機30001訪問docker容器22埠容器,並且共享/mnt目錄,用於系統操作,執行前提是安裝好ssh軟體
root@duke:/etc/systemd#docker run -p 30001:22 --name ubuntu14.04-ssh-vim -v /mnt:/mnt -d ubuntu14.04-ssh-vim:0.1 /run.sh
- 進入容器後,安裝相關軟體
- 然後生成新的映象即可,在生成新的映象前,不能關閉容器,否則,系統還原
十二、 Nvidia-docker 1.0
12.1 線上安裝nvidia-docker
命令如下:
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
執行過程如下:
root@duke:~# wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
--2017-11-29 10:48:50-- https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
正在解析主機 github.com (github.com)... 192.30.255.113, 192.30.255.112
正在連線 github.com (github.com)|192.30.255.113|:443... 已連線。
已發出 HTTP 請求,正在等待迴應... 302 Found
位置:https://github-production-release-asset-2e65be.s3.amazonaws.com/45557469/d4efc7cc-ff73-11e6-91a2-ce84b8670fcd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20171129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20171129T024853Z&X-Amz-Expires=300&X-Amz-Signature=1813c7a54d9cbf87cd63f4bae62337eb8a08db86c6e278776f0df49de8a1975f&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dnvidia-docker_1.0.1-1_amd64.deb&response-content-type=application%2Foctet-stream [跟隨至新的 URL]
--2017-11-29 10:48:53-- https://github-production-release-asset-2e65be.s3.amazonaws.com/45557469/d4efc7cc-ff73-11e6-91a2-ce84b8670fcd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20171129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20171129T024853Z&X-Amz-Expires=300&X-Amz-Signature=1813c7a54d9cbf87cd63f4bae62337eb8a08db86c6e278776f0df49de8a1975f&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dnvidia-docker_1.0.1-1_amd64.deb&response-content-type=application%2Foctet-stream
正在解析主機 github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.129.11
正在連線 github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.129.11|:443... 已連線。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度: 2266050 (2.2M) [application/octet-stream]
正在儲存至: "/tmp/nvidia-docker_1.0.1-1_amd64.deb.1"
8% [=======> ] 181,822 3.59KB/s 估時 9m 27s
root@duke:~#dpkg -i /tmp/nvidia-docker*.deb
12.2 離線安裝nvidia-docker
在官方下載nvidia-docker非常緩慢,可以選擇其他渠道進行下載nvidia-docker,通過U盤存入到ubuntu系統後,在進行安裝。安裝命令如下:
root@duke:~/nvidia-docker# dpkg -i nvidia-docker_1.0.1-1_amd64_1.deb
(正在讀取資料庫 ... 系統當前共安裝有 200118 個檔案和目錄。)
正準備解包 nvidia-docker_1.0.1-1_amd64_1.deb ...
正在解包 nvidia-docker (1.0.1-1) ...
正在設定 nvidia-docker (1.0.1-1) ...
Configuring user
Setting up permissions
nvidia-docker start/running, process 2740
正在處理用於 ureadahead (0.100.0-16) 的觸發器 ...
12.3 測試nvidia-docker
root@duke:~/nvidia-docker# nvidia-docker run --rm nvidia/cuda nvidia-smi
Using default tag: latest
latest: Pulling from nvidia/cuda
660c48dd555d: Pull complete
4c7380416e78: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
f597507b3c37: Pull complete
9c5d4127a23d: Pull complete
398bf259fcdc: Pull complete
4f4092762618: Pull complete
94130a21e154: Pull complete
Digest: sha256:954c82d2d060f38de13b3d7933b7e1549b25330cc6412008dc1253f3c148448d
Status: Downloaded newer image for nvidia/cuda:latest
Wed Nov 29 03:33:46 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.66 Driver Version: 384.66 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:02:00.0 Off | N/A |
| 23% 28C P8 9W / 250W | 10MiB / 11172MiB | 0% Default |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
12.4 使用nvidia-docker的要素
- 安裝了nvidia-docker不代表可以直接從宿主機中獲取顯示卡驅動,還是需要在容器中安裝cuda+cudnn
- 宿主機如果不安裝顯示卡驅動,就算nvidia-docker啟動的容器安裝了cuda+cudnn,也是無法使用顯示卡的
- 如果想省事的直接獲取安裝好cuda+cudnn的容器映象,可以在docker的官網獲取對應版本的容器,地址為:https://hub.docker.com/r/nvidia/cuda/
十三、 Nvidia-docker 2.0
13.1 線上安裝nvidia-docker2.0
- 刪除nvidia-docker 1.0的相關容器
docker volume ls -q -f driver=nvidia-docker | xargs -r -I {} -n1 docker ps -q -a -f volume = {} | xargs -r docker rm -f
- 刪除nvidia-docker 1.0
apt-get purge -y nvidia-docker
-
新增nvidia-docker的軟體源
①新增金鑰curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |sudo apt-key add -
②獲取版本資訊給變數
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
③將nvidia-docker源新增到源列表
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |tee /etc/apt/sources.list.d/nvidia-docker.list
④更新源
apt-get update
-
安裝nvidia-docker2(
注意nvidia-docker2必須使用docker-ce 18.06.3版本,否則安裝報錯
)apt-get install -y nvidia-docker2
- 設定docker配置
tee /etc/docker/daemon.json <<EOF { "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } EOF
- 重啟docker
pkill -SIGHUP dockerd
13.2 nvidia-docker2.0使用命令
- 使用全部gpu
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi 或 docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm nvidia/cuda nvidia-smi
- 指定使用某個gpu
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 --rm nvidia/cuda nvidia-smi 或 docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1 --rm nvidia/cuda nvidia-smi
- 指定使用多個gpu
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0,1 --rm nvidia/cuda nvidia-smi
十四、 安裝weave網路控制
Weave和flannel一樣是用於控制網路層軟體,可以利用該軟體做多機之間的容器跨主機網路連線。
安裝方法:
1、直接在網上下載weave,然後將之放到/usr/local/bin/
目錄下,用chmod a+x /usr/local/bin/weave
命令給weave附上執行許可權,即可完成安裝
2、 當使用weave時,weave會從官網下載docker映象建立容器,從而開啟應用,此時,可以將預先下載好的映象存出,例如:weaveworks-weave-2.1.3.tar weaveworks-weavedb.tar weaveworks-weaveexec-2.1.3.tar
這3個包,然後在安裝的機器上進行docker映象存入。
3、 完成上面操作後,啟動weave,docker就會自動建立weave所依賴的容器。
十五、 應用例項
15.1 Nvidia-docke0.1 建立跨機指定CPU、GPU、記憶體、永久持久卷的跨機網路連線的容器
15.1.1 硬體及容器配置資訊:
宿主機 | IP地址 | 容器 | 容器IP地址 |
---|---|---|---|
伺服器1 | 10.0.0.213 | Ubuntu14.04 | 192.168.0.2 |
伺服器2 | 10.0.0.214 | Ubuntu14.04 | 192.168.0.3 |
15.1.2安裝weave和bridge-utils:
weave參考上章節,bridge-utils安裝如下:
root@duke-1:~# apt-get install bridge-utils
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹
正在讀取狀態資訊... 完成
下列【新】軟體包將被安裝:
bridge-utils
升級了 0 個軟體包,新安裝了 1 個軟體包,要解除安裝 0 個軟體包,有 147 個軟體包未被升級。
需要下載 28.6 kB 的歸檔。
解壓縮後會消耗 102 kB 的額外空間。
獲取:1 http://10.31.48.30/ubuntu xenial/main amd64 bridge-utils amd64 1.5-9ubuntu1 [28.6 kB]
已下載 28.6 kB,耗時 0秒 (308 kB/s)
正在選中未選擇的軟體包 bridge-utils。
(正在讀取資料庫 ... 系統當前共安裝有 242652 個檔案和目錄。)
正準備解包 .../bridge-utils_1.5-9ubuntu1_amd64.deb ...
正在解包 bridge-utils (1.5-9ubuntu1) ...
正在處理用於 man-db (2.7.5-1) 的觸發器 ...
正在設定 bridge-utils (1.5-9ubuntu1) ...
15.1.3 10.0.0.213主機配置
-
啟動weave
root@duke-2:~# weave launch
Network 10.32.0.0/12 overlaps with existing route 10.0.0.128/25 on host
ERROR: Default --ipalloc-range 10.32.0.0/12 overlaps with existing route on host.
You must pick another range and set it on all hosts. -
因為在內網環境,導致預設的ip和內網ip存在衝突,所以報錯,採用指定ip方式啟動
root@duke-2:~# weave launch --ipalloc-range 10.2.0.0/16
8b2b34704e7dc5e4eac3c517ada5d79f5a52c488ef9d5a02551e75e757654b52 -
Weave啟動後,就會在docker下建立幾個依賴的容器,內容如下:
root@duke-2:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b2b34704e7d weaveworks/weave:2.1.3 "/home/weave/weaver …" 26 seconds ago Up 25 seconds weave
6ceceb78c749 weaveworks/weaveexec:2.1.3 "data-only" 26 seconds ago Created weavevolumes-2.1.3
6c0e3cd0fe84 weaveworks/weavedb:latest "data-only" 26 seconds ago Created weavedb
f46a3490457b ubuntu "/bin/bash" 22 hours ago Up 2 hours a0262000091 -
指定GPU、CPU、記憶體、資料地址、永久卷地址建立容器
root@duke-2:~# NV_GPU=0 nvidia-docker run -p 30001:22 --name ufo -v /data1/docker_disk/ufo:/work -v /data/caffe_data:/data --cpuset-cpus=0,1,2,3 -m 16g --memory-swap 0 -it -d duke/cuda8-cudnn6-devel-ubuntu14.04-ssh:0.1 /run.sh
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
c58051baa911b68469146c5090851613692538d6532335042d7e74602592820c
root@duke-2:~# ls -
分配容器ip
root@duke-2:/data/caffe_data# weave attach 192.168.0.2/24 ufo
192.168.0.2
【備註】:
1、Weave的 weave launch操作,只需要在每臺機器上執行一次,後續的容器建立只需要新增容器的ip即可
2、如果遇到下面問題時,關閉防火牆即可,如centos7的預設防火牆關閉命令是
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
問題形式如下:
[root@localhost ~]# weave launch --ipalloc-range 10.2.0.0/16
WARNING: existing iptables rule
'-A FORWARD -j REJECT --reject-with icmp-host-prohibited'
will block name resolution via weaveDNS - please reconfigure your firewall.
517f07cdb502824ad7a7bec5532dd37984b19c49cbab4ce4c8130c4f6e9d7d0c
15.2 容器自啟動
15.2.1 Restart policy關鍵字說明
restart policy在使用docker run啟動容器時通過--restart標誌指定,這個標誌有多個value可選,不同的value有不同的行為,如下表所列:
關鍵字 | |
---|---|
no | 不自動重啟容器. (預設value) |
on-failure | 容器發生error而退出(容器退出狀態不為0)重啟容器 |
unless-stopped | 在容器已經stop掉或Docker stoped/restarted的時候才重啟容器 |
always | 在容器已經stop掉或Docker stoped/restarted的時候才重啟容器 |
舉個例子:下面的命令啟動一個Redis容器,當Redis容器停止後或者Docker被重啟時,Redis容器都會重啟。
[root@localhost ~]# docker run -dit --restart=unless-stopped redis
15.2.1 Restart policy細節
使用restart policies時需要注意如下細節:
- 容器只有在成功啟動後restart policy才能生效。這裡的"成功啟動"是指容器處於up至少10秒且已經處於docker監管。這是避免沒有成功啟動的容器陷入restart的死迴圈。
- 如果手動(manually)的stop(與前面的explicitly stopped有何區別)一個容器,容器設定的restart policy將會被忽略,除非Docker daemon重啟或者容器手動重啟。這是避免了另外一種死迴圈。
- restart policies只能用於容器,對於swarm services其restart policies有不通過的配置。
15.2.2 Docker容器開機自動啟動
在使用docker run啟動容器時,使用--restart引數來設定:
root@duke:~/docker$ docker run --restart=unless-stopped -p 30001:22 --name metis_test --hostname metis -v /home/dilu/metis_docker:/work -d ubuntu18.04-ssh:0.1 /run.sh
還可以在使用on - failure策略時,指定Docker將嘗試重新啟動容器的最大次數。預設情況下,Docker將嘗試永遠重新啟動容器。
root@duke:~/docker$ docker run --restart=on-failure:10 redis
十六、 當docker啟動不了解決方法
直接刪除/var/lib/docker下的內容,就相當於將docker重置,當然images下的可以不刪除
root@duke:~/docker# rm -rf /var/lib/docker/*