Docker 學習筆記【3】 Docker 倉庫實操,創建私有倉庫,實操數據卷、數據卷容器,實操 網絡基礎 ---------高級網絡配置和部分實戰案例學習
=============================================================
Docker 學習筆記【1】Docker 相關概念,基本操作--------實操記錄開始
=============================================================
被格式化的腳本內容:
#開頭代表宿主機的root用戶執行的命令
[root@ec600b17b4ad /]# 類似開頭的,實在docker啓動的實例中執行的命令
--1--安裝:
1、環境信息:
硬件:基於openstack的一臺雲虛擬主機 配置爲:16C 32GB 此機上還運行了:兩個mysql數據庫,一個開發,一個測試,一個tomcat做zabbix通過jmx監控實驗,後續會有相關文檔 系統信息:CentOS release 6.8 (Final) uname -a:Linux b-test14 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 用戶:root
2、開始安裝:
安裝docker:
#yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm #yum install docker-io
檢查安裝:
#docker -v Docker version 1.7.1, build 786b29d/1.7.1 # ifconfig docker0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::dcb0:1aff:fe0a:8982/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:460 (460.0 b) TX bytes:468 (468.0 b)
啓動docker後臺服務:
# service docker start Starting cgconfig service: [ OK ] Starting docker: [ OK ] # chkconfig docker on
後臺服務啓動檢查:
#ps -ef | grep docker root 15982 1 0 10:33 pts/1 00:00:00 /usr/bin/docker -d root 16154 15286 0 10:35 pts/1 00:00:00 grep docker # chkconfig --list | grep docker docker 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3、獲取鏡像:
注:12.04爲筆記【1】中的內容,呼應一下,不過我們應用主要跑在centos下,所以後續的主要實操會基於centos 6.8
# docker pull ubuntu:12.04 12.04: Pulling from ubuntu 94bf32934729: Pull complete 5e12b5525fb8: Pull complete df24de65c977: Pull complete 8cc279ff6556: Pull complete 13c47942ea6e: Pull complete cfc2576a1531: Pull complete Digest: sha256:6ab19ca6ef048136b8aeb513e6fb715c005fd671a536039567b1d261f2f0779e Status: Downloaded newer image for ubuntu:12.04 # docker pull centos:6.8 6.8: Pulling from centos 3690474eb5b4: Pull complete 386c6db8c14f: Pull complete 8986abc42d08: Pull complete 80e46367f846: Pull complete Digest: sha256:233cbc13832f97e83773d2e4a6f9f3a81959bc9b5c1b03135d6bbd67a9db8b66 Status: Downloaded newer image for centos:6.8
本地鏡像檢查:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
4、擴展:
time命令,可以統計某個命令執行耗時,如下,可看出docker啓動一個echo應用,約3s:
time docker run centos:6.8 /bin/echo what what real 0m2.645s user 0m0.031s sys 0m0.027s
通過鏡像啓動一個docker實例,整個過程約3s:
啓動echo應用輸出一個what,效率略低於直接在本地執行:
# docker run centos:6.8 /bin/echo what what
啓動bash交互界面,啓動過程約3-5s可以通過ps看出,啓動十分輕量級
# docker run -t -i centos:6.8 /bin/bash [root@ec600b17b4ad /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [root@ec600b17b4ad /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 02:42 ? 00:00:00 /bin/bash root 12 1 0 02:42 ? 00:00:00 ps -ef [root@ec600b17b4ad /]# pwd /
5、修改鏡像:
終端1【不要exit】:
#docker run -t -i centos:6.8 /bin/bash [root@ec600b17b4ad /]# yum install lrzsz Loaded plugins: fastestmirror, ovl Setting up Install Process Determining fastest mirrors * base: mirrors.btte.net * extras: mirrors.btte.net * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package lrzsz.x86_64 0:0.12.20-27.1.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================= Installing: lrzsz x86_64 0.12.20-27.1.el6 base 71 k Transaction Summary ================================================================================================================================= Install 1 Package(s) Total download size: 71 k Installed size: 159 k Is this ok [y/N]: y Downloading Packages: lrzsz-0.12.20-27.1.el6.x86_64.rpm | 71 kB 00:00 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Importing GPG key 0xC105B9DE: Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]> Package: centos-release-6-8.el6.centos.12.3.x86_64 (@CentOS/6.8) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Verifying : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Installed: lrzsz.x86_64 0:0.12.20-27.1.el6 Complete!
終端2:
注意:
查看所有已經創建的container實例:
#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17d146c6710d centos:6.8.my.1 "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago kickass_swartz 4bdb037d6f75 cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c 'yum -y 22 minutes ago Exited (137) 20 minutes ago berserk_kilby 8f2e422eb7ae cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c 'yum ins 23 minutes ago Exited (1) 22 minutes ago evil_mestorf 11b3d795a062 centos:6.8.my "/bin/bash" 25 minutes ago Exited (0) 24 minutes ago suspicious_mccarthy e283711c5bdf centos:6.8.my "/bin/bash" 26 minutes ago Exited (1) 26 minutes ago stupefied_cori 4a74b6b158f0 centos:6.8.my "/bin/bash" 35 minutes ago Exited (0) 31 minutes ago backstabbing_mcclintock ec600b17b4ad centos:6.8 "/bin/bash" 42 minutes ago Exited (0) 35 minutes ago loving_lovelace 8864174c48ea centos:6.8 "/bin/bash" 47 minutes ago Exited (0) 46 minutes ago jolly_torvalds 591e0f5c1817 centos:6.8 "/bin/bash" 49 minutes ago Exited (0) 49 minutes ago cranky_torvalds bc2496541488 centos:6.8 "/bin/echo what" 50 minutes ago Exited (0) 50 minutes ago fervent_cori 2b7ee7dc7a4d centos:6.8 "/bin/bash" 52 minutes ago Exited (0) 51 minutes ago focused_bartik f144b72eb4ab centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago elegant_bohr 547b76094492 centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago sad_poitras 查看CONTAINER ID # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec600b17b4ad centos:6.8 "/bin/bash" About a minute ago Up About a minute loving_lovelace
通過運行中的CONTAINER創建鏡像centos:6.8.my,返回的id爲鏡像的唯一id
# docker commit -m "ADDed lrzsz" -a "Docker my-a" ec600b17b4ad centos:6.8.my c24da2edd993ebbbbabb81ab349f2146813ea34f9f87821630fd13ad1ab4c745
羅列所有可用鏡像:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 About a minute ago 255 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用修改的鏡像啓動容器實例:
如下可見,剛纔在容器通過yum安裝的軟件已經包含在了自己創建的鏡像。
# docker run -t -i centos:6.8.my /bin/bash [root@4a74b6b158f0 /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64
6、創建docker鏡像:
->1、使用Dockerfile:
創建目錄和makefile文件:
#mkdir image_maker_sinatra #cd image_maker_sinatra #touch Dockerfile
確認鏡像中不存在my.tag的文件
# docker run -t -i centos:6.8.my /bin/bash [root@e283711c5bdf /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [root@e283711c5bdf /]# exit exit
Dockerfile內容:
#cenos:6.8.my.1 maker FROM centos:6.8.my MAINTAINER Docker lich <[email protected]> RUN echo "my tag" > my.tag
執行新建鏡像:
# docker build -t "centos:6.8.my.1" . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos:6.8.my ---> c24da2edd993 Step 1 : MAINTAINER Docker lich <[email protected]> ---> Using cache ---> cbbdcb29ca21 Step 2 : RUN echo "my tag" > my.tag ---> Running in f89b6bc65148 ---> 3ebfbda17fb8 Removing intermediate container f89b6bc65148 Successfully built 3ebfbda17fb8
查看所有centos鏡像:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 About a minute ago 255 MB centos 6.8.my c24da2edd993 19 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用新鏡像啓動docker容器,檢驗內容:
如下內容可以看出,6.8.my中的lrzsz存在,並且Dockerfile中指定生成的文件、以及其內容都存在:
# docker run -t -i centos:6.8.my.1 /bin/bash [root@17d146c6710d /]# ls bin dev etc home lib lib64 lost+found media mnt my.tag opt proc root sbin selinux srv sys tmp usr var [root@17d146c6710d /]# cat my.tag my tag [root@17d146c6710d /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64 [root@17d146c6710d /]# exit exit
-2>使用openvz【容器虛擬化的先鋒技術】創建鏡像:
先下載鏡像【可能需要跳出牆外,這個網址在國內的訪問速度幾乎爲0】:
#wget https://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz
使用的時候報錯了,這個錯誤的原因是下載的文件有問題,不完整或者有損壞:
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 Error response from daemon: ApplyLayer exit status 1 stdout: stderr: unexpected EOF
重新下載之後,導入完成
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 35b7ec25ed6f9657ff7581a8c7643c2ce48d1b892eac6116b783b43fc8fd9bfc
docker attach的時候執行了一個exit,導致主機除了一些問題:
報錯:
# docker pull centos:6.8 Pulling repository centos Get https://index.docker.io/v1/repositories/library/centos/images: dial tcp: lookup index.docker.io: Temporary failure in name resolution
解決:
重新登錄一下
【由於之前系統出現了一些問題,所以刪除了部分image,現有image如下,可見my_centos:6.8已經在本地倉庫了】
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8 35b7ec25ed6f 36 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
7、鏡像導出、導入:
導出【需要本地存在該鏡像,如果不存在,請先pull下來】:
# docker save -o centos_68my1.tar centos:6.8.my.1 # ll total 256636 -rw-r--r-- 1 root root 262789632 Nov 10 11:31 centos_68my1.tar . # du -sh * 251M centos_68my1.tar
導入:
1、導入會校驗id,如果一樣就不導入了,所以要刪除創建時候使用的鏡像centos:6.8.my.1:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 22 minutes ago 255 MB centos 6.8.my c24da2edd993 39 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker rmi 3ebfbda17fb8 Error response from daemon: Conflict, cannot delete 3ebfbda17fb8 because the container 17d146c6710d is using it, use -f to force Error: failed to remove images: [3ebfbda17fb8]
報錯信息指向一個容器,說又通過該鏡像啓動的容器實例,因此我們需要使用-f命令強制刪除鏡像和通過該鏡像創建的所有實例
# docker rmi -f 3ebfbda17fb8 Untagged: centos:6.8.my.1 Deleted: 3ebfbda17fb85e28ae24faa77cf8d7811e0068f428a4763042708b15d00ee2aa Deleted: cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f
可以看到,centos:6.8.my.1被刪除了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 42 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
2、刪除後,進行導入操作:
# docker load --input centos_68my1.tar
可以看到導入之後鏡像庫裏面的鏡像就回來了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改鏡像的TAG: centos:6.8.my.1 centos:6.8.my 這樣的TAG不夠明顯,修改一下: 首先查出image對應id: # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改TAG: # docker tag c24da2edd993 my_centos:11.10.1 # docker tag 3ebfbda17fb8 my_centos:11.10.2 # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 29 minutes ago 255 MB centos 6.8.my c24da2edd993 47 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker images my_centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 11.10.2 3ebfbda17fb8 29 minutes ago 255 MB my_centos 11.10.1 c24da2edd993 47 minutes ago 255 MB
從結果可以看出,好像是創建了兩個新的鏡像,實際上仔細觀察就會發現他們的IMAGE ID 是一樣的,也就是說,相當於創建了兩個不一樣名字的快捷方式,其實實體image還是同一個!
刪除鏡像:
在導入的時候由於需要刪除再導入,已經介紹了,就不演示了
注意點:
docker rm 是刪除依賴於這個鏡像所有的docker容器的命令
docker rmi執行前,需要先執行docker rm 或者 在rmi後面加上-f 強制刪除參數,將會刪除鏡像以及鏡像創建出的所有容器!
8、守護態啓動容器:
# docker run -d my_centos:11.10.1 /bin/sh -c "while true;do echo what is your name;sleep 1;done" f00717ca5c5eb4e449181bb99b98e8e86910b957ceda82f31e5440bf61cef979
查看運行中實例:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f00717ca5c5e my_centos:11.10.1 "/bin/sh -c 'while t 39 seconds ago Up 37 seconds serene_cray
查看容器輸出內容
# docker logs serene_cray what is your name what is your name what is your name 。 。 。 或者 # docker logs f00717ca5c5e what is your name what is your name what is your name 。 。 。
9、終止運行中容器:
docker stop後面可以跟上id 也可是names
# docker stop serene_cray serene_cray # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10、進入守護態容器:
啓動一個守護態容器:
# docker run -t -i -d my_centos:11.10.1 /bin/bash 3e4c55543d86c86961c3d0f1d7b8af212a8943e9a6c58171c61e7b5fe98fbf29 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e4c55543d86 my_centos:11.10.1 "/bin/bash" 4 seconds ago Up 2 seconds agitated_albattani
1、attach進入【命令完了需要多敲回車】:
# docker attach agitated_albattani [root@3e4c55543d86 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [root@3e4c55543d86 /]# uname -a Linux 3e4c55543d86 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [root@3e4c55543d86 /]# cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m
注:exit命令會導致容器終止!只推出attach 使用 ctrl+p 之後 ctrl+q即可推出attach 而不終止容器
2、nsenter進入:
確認版本:
# nsenter -V nsenter from util-linux-ng 2.17.2 查看docker後臺運行容器的第一pid: # docker inspect --format "{{ .State.Pid }}" 43a81bd378f9 12590
將.bashrc_docker 內容加到.bashrc中
#wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker #echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
連接到後臺運行的docker容器
【此方式可以使用exit,並且多個人登錄獲得的終端不是同步的】
# nsenter --target 12590 --mount --uts --ipc --net --pid [root@43a81bd378f9 /]# ls bin boot dev etc fastboot home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [root@43a81bd378f9 /]# mpstat -bash: mpstat: command not found [root@43a81bd378f9 /]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 27886420 65100 933628 0 0 28 31 27 33 0 0 99 1 0 [root@43a81bd378f9 /]# free -g total used free shared buffers cached Mem: 31 4 26 0 0 0 -/+ buffers/cache: 3 27 Swap: 0 0 0 [root@43a81bd378f9 /]# exit logout
11、運行中的容器快照導出,還原爲鏡像:
導出:
#docker export 43a81bd378f9 > my_centos.tar
導入【將當時的快照狀態還原成鏡像,不包括元數據和歷史記錄等】:
# cat my_centos.tar| docker import - my_centos:6.8.0 8247cb10fde2c99f1febfa11d5729175fb5be9afdbdf3fb581d20259e9fcd392 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8.0 8247cb10fde2 28 seconds ago 343.8 MB my_centos 6.8 35b7ec25ed6f 53 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
12、刪除容器:
docker ps
1終止狀態容器
# docker rm 43a81bd378f9 43a81bd378f9
2運行中容器:
# docker rm -f 43a81bd378f9 43a81bd378f9
=============================================================
Docker 學習筆記【1】Docker 相關概念,基本操作--------實操記錄結束
=============================================================
=============================================================
Docker倉庫、數據卷,網絡基礎學習
=============================================================
--2--倉庫:
1、概念:
倉庫就是集中存放鏡像的地方
一個比較容易混淆的就是註冊服務器【Registry】,相當於一個很多倉庫的管理器,合集如:
dl.dockerpool.com/ubuntu
dl.dockerpool.com註冊服務器 ubuntu是倉庫名
多數時候不嚴格區分
2、Docker Hub:
Docker官方維護的一個公共倉庫,已經包括了超過15000的鏡像,基本需求都可以直接下載使用。
登錄:
docker login可以輸入用戶名密碼和郵箱完成註冊和登錄,存儲的信息在~/.dockercfg
基本操作:
搜索相關鏡像:
docker search centos
下載鏡像:
docker pull ${REPOSITORY}:${TAG}
自動創建:
對於要經常升級鏡像內程序來說,十分方便。
有時候用戶創建鏡像只是爲了安裝某個軟件,如果軟件發佈,則是需要手動更新鏡像。
而自動創建允許用戶通過Docker Hub指定跟蹤一個目標網站,目前支持:GitHub和BitBucket上的項目一旦項目發生新提交,則執行自動更新。
配置自動升級步驟:
1、創建並登陸Docker Hub以及目標網站;
2、在目標網站將賬號鏈接到Docker Hub;
3、Docker Hub中創建一個自動創建;
4、選取一個目標網站中的項目,需要包含Dockerfile,和分支;
5、指定Dockerfile的位置,並提交創建;
6、Docker Hub在自動創建頁面跟蹤每次創建的狀態
3、私有倉庫:
簡述:
docker-registry官方提供的工具,可以用於構建私有的鏡像倉庫
安裝運行--官方給出的registry鏡像:
安裝完Docker後,可以通過獲取官方registry鏡像來運行:
docker run -d -p 5000:5000 registry
這將使用官方的registry鏡像啓動本地倉庫,用戶也可以通過制定參數配置私有倉庫位置,比如亞馬遜的s3存儲:
docker run -e SETTINGS_FLAVOR=s3 -e AWS_BUCKET=存儲桶的名稱 -e STORGE_PATH=/registry【s3桶存儲沒有目錄,只是爲了做訪問路徑用】 -e AWS_KEY=用戶創建s3的key -e AWS_SECRET=亞馬遜登錄憑證 -e SEARCH_BACKEND=備份位置 -p 5000:5000 registry
此外,可以制定本地路徑,如【將鏡像存儲位置修改爲/home/admin/registry】:
docker run -d -p 5000:5000 -v /home/admin/registry:/registry registry
安裝運行--本地運行:
yum方式:
yum install -y python-devel libevent-devel python-pip gcc xz-devel pip install docker-registry
也可下載源碼進行安裝:
git clone https://github.com/docker/docker-registry.git cd docker-registry python setup.py install
啓動:
docker-registry
修改config.yml的內容修改鏡像存儲內容:storage_path
cp config/config_sample.yml config/config.yml
高級模式:
啓動web服務:
gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
或者:
gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
提交指定容器到私有倉庫:
docker tag ubuntu:12.04 私有庫IP:5000/ubuntu:12.04 docker push 私有庫IP:5000/ubuntu
從指定服倉庫下載:
docker pull ${REPOSITORY}:${TAG}
自動上傳本地所有image到本地的鏡像,默認的服務器爲127.0.0.1:5000:
wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh chmod a+x push_images.sh ./push_images.sh
查看私服中的所有鏡像:
curl 私有庫IP:5000/v1/search
返回的是json,裏面的鏡像列表
倉庫配置文件【默認配置文件中】:
Docker的registry利用配置文件提供了一些倉庫的模板,flavor,用戶可以直接使用它們進行開發或者測試生產的部署
配置文件模板解釋:
common :基礎配置 ocal :存儲數據到本地文件系統 s3 :存儲數據到 AWS S3 中 dev :使用 local 模板的基本配置 test :單元測試使用 prod :生產環境配置(基本上跟s3配置類似) gcs :存儲數據到 Google 的雲存儲 swift :存儲數據到 OpenStack Swift 服務 glance :存儲數據到 OpenStack Glance 服務,本地文件系統爲後備 glance-swift :存儲數據到 OpenStack Glance 服務, Swift 爲後備 elliptics :存儲數據到 Elliptics key/value
用戶也可以自定義模板段
默認使用的模板是dev,要使用某個模板作爲默認值,添加SETTINGS_FLAVOR到環境變量例如:
export SETTINGS_FLAVOR=dev
文件中,支持環境變量中加載某些值:
_env:VARIABLENAME[:DEFAULT]
文件示例:
common: loglevel:info search_backend:"_env:SEARCH_BACKEND:" sqlalchemy_index_database:"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db" prod: loglevel:warnstorage:s3 s3_access_key:_env:AWS_S3_ACCESS_KEY s3_secret_key:_env:AWS_S3_SECRET_KEY s3_bucket:_env:AWS_S3_BUCKET boto_bucket:_env:AWS_S3_BUCKET storage_path:/srv/docker smtp_host:localhost from_addr:[email protected] to_addr:[email protected] dev: loglevel:debugstorage:local storage_path:/home/myself/docker test: storage:local storage_path:/tmp/tmpdockertmp
--3--數據卷和數據卷容器:
Docker內部以及容器之間如何管理數據,主要方式就是:
1、數據卷:DATA VOLUMES
2、數據卷容器:DATA VOLUME CONTAINERS
1、數據卷:
數據卷是一個可提供一個或者多個容器使用的特殊目錄,它繞過UFS,可提供很多的有用的特性:
1>數據卷可以再各容器實例之間共享和重複使用
2>對數據卷的修改立即生效
3>對數據卷的更新不影響鏡像
4>卷一直存在,知道沒有容器再使用
2、創建數據卷:
docker 命令使用-v參數來創建一個數據卷並掛在到容器中:
創建一個名爲web 的容器,並創建一個數據卷/webapp
docker run -d -P --name web -v /webapp training/webapp python app.py
Dockerfile中也可以使用VOLUME 來添加一個或者多個新的數據捲到該鏡像創建的任意容器中
掛在一個宿主機的目錄作爲數據卷:
將主機的/src/webapp目錄加到到容器的/opt/webapp目錄下
注意:
1、一般用於測試,docker運行是否正常
2、目錄路徑必須是絕對路徑
3、如果本地路徑目錄不存在,docker會自動創建
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
默認掛在的數據卷權限是讀寫皆可,如要掛在一個只讀權限的目錄如下:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
當然也可以掛在單個文件到容器,必須想記錄容器中的history的命令記錄
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注意:
只掛在一個文件,在使用編輯工具的時候,比如 vi sed等,會導致文件inode的改變,1.1.0版本的docker起,這會導致報錯。最好的辦法是,掛在文件所在的父目錄
x、數據卷容器:
如果有一些持續更新的數據需要在容器之間共享,最好創建一個數據卷容器:
數據卷容器其實也是一個容器,功能是專門提供數據卷供其他容器掛在!
創建一個數據卷容器,容器名字爲dbdata:
docker run -it -v /dbdata:/dbdata --name dbdata training/postgres centos #docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container fo...
創建其他容器時,使用--volumes-from來掛在dbdata中的數據卷
docker run -d --volumes-from dbdata --name db1 training/postgres docker run -d --volumes-from dbdata --name db2 training/postgres
也可以使用多個--volumes-from 參數來從多個容器掛載多個數據卷,也可以從其他已經掛在了數據卷的容器來掛在數據卷
docker run -d --name db3 --volumes-from db1 training/postgres
使用--volumes-from參數所掛載數據卷的容器自己並不需要保持在運行狀態
如果刪除了掛載的容器,數據卷並不會自動刪除,如果需要刪除一個數據卷,必須在刪除最後一個還掛載着該數據卷的容器時候使用docker rm -v來刪除關聯的數據卷,這可以讓我們在容器之間升級和移動數據卷
3、利用數據卷容器,進行備份、恢復、遷移數據卷:
可以利用數據卷對其中的數據進行備份、恢復、遷移
備份:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar
容器啓動後,使用了 tar 命令來將 dbdata 卷備份爲本地的 /backup/backup.tar
恢復:
如果要恢復數據到一個容器,首先,要創建一個帶有數據卷的容器:dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然後創建另一個容器,並使用tar解壓備份文件到掛在的容器中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
這樣就完成了數據的備份和恢復
--4--docker中的網絡:
Docker 允許通過外部訪問容器或容器互聯的方式來提供網絡服務。
1、外部訪問容器:
docker在run的時候使用-P標記,會使Docker隨機映射一個49000-49900的端口到內部容器開放的端口
docker run -d -P training/webapp python app.py docker ps
使用docker ps可以看到
PORTS列,有這樣的標記0.0.0.0:49000->5000
此時訪問,宿主機ip的49000端口就是訪問docker容器的5000提供的web服務端口
可使用docker logs -f ${CONATINER_ID}持續關注docker的輸出
docker在run的時候使用-p標記,則可以指定端口並且一個端口只可以綁定一個容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有接口地址
使用hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以執行
docker run -d -p 5000:5000 training/webapp python app.py
映射到指定ip的指定端口:
可以使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址,比如 localhost 地址 127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
當然還可以使用udp標記來指定udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看已經映射的端口配置:
docker port ${CONATINER_ID} 5000
注意: 1、容器有自己的內部網絡和ip地址【使用docker inspect 可以獲取所有變量。Docker還可以有一個可變的網絡配置】 2、-p可以使用多次來綁定多個端口: docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
--5--容器互聯:
容器的連接【linking】是除了端口映射以外,另一種與容器中應用交互的方式
該系統會在源和接受容器之間創建一個隧道,接受容器可以看到源容器的指定信息
自定義容器名稱 --name
1、好記 有意義的名稱好使用
2、可以作爲參考點
docker run -d -P --name web training/webapp python app.py
docker ps 列表中會有NAME列
inspect查看docker的名字
docker inspect -f "{{ .Name }}" aed84ee21bde
注意:--rm 在終止實例後即刪除容器實例 與 --d 不可同時使用
容器互聯:--link參數讓容器之間進行安全交互
創建一個新的數據容器
docker run -d --name db training/postgres
清空容器實例列表
創建一個新的web容器連接到db容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py
此時,db 容器和 web 容器建立互聯關係。
--link 參數的格式爲
--link name:alias ,其中
name 是要鏈接的容器的名稱, alias 是這個連接的 別名。
docker ps
可以用來查看容器link
可以看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器鏈接到 db 容器,web 容器將被允許訪問 db 容器的信息。
Docker 在兩個互聯的容器之間創建了一個安全隧道,而且不用映射它們的端口到宿主主機上。在啓動 db容器的時候並沒有使用 -p 和 -P 標記,從而避免了暴露數據庫端口到外部網絡上。
1、Docker通過兩種方式爲容器公開連接信息:
1、環境變量
2、更新/etc/hosts文件
env查看當前變量
sudo docker run --rm --name web2 --link db:db training/webapp env
其中 DB_ 開頭的環境變量是供 web 容器連接 db 容器使用,前綴採用大寫的連接別名。
docker run -t -i --rm --link db:db training/webapp /bin/bash cat /etc/hosts
裏面會有兩個一個是當前容器的name解析 一個是link的容器的name解析
用戶可以連接多個子容器到父容器。