Docker 學習筆記【2】 Docker 基礎操作實,Docker倉庫、數據卷,網絡基礎學習

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解析

用戶可以連接多個子容器到父容器。


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