Docker 学习笔记【3】 Docker 仓库实操,创建私有仓库,实操数据卷、数据卷容器,实操 网络基础  ---------高级网络配置和部分实战案例学习

=============================================================

Docker 学习笔记【1】Docker 相关概念,基本操作--------实操记录开始

=============================================================


被格式化的脚本内容:

#开头代表宿主机的root用户执行的命令

[root@ec600b17b4ad /]# 类似开头的,实在docker启动的实例中执行的命令


--1--安装:


1、环境信息:

  1. 硬件:基于openstack的一台云虚拟主机
  2. 配置为:16C 32GB
  3. 此机上还运行了:两个mysql数据库,一个开发,一个测试,一个tomcat做zabbix通过jmx监控实验,后续会有相关文档
  4. 系统信息:CentOS release 6.8 (Final)
  5. 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
  6. 用户:root


2、开始安装:


安装docker:

  1. #yum install  http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
  2. #yum install docker-io


检查安装:

  1. #docker -v
  2. Docker version 1.7.1, build 786b29d/1.7.1
  3. # ifconfig
  4. docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
  5.           inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
  6.           inet6 addr: fe80::dcb0:1aff:fe0a:8982/64 Scope:Link
  7.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  8.           RX packets:7 errors:0 dropped:0 overruns:0 frame:0
  9.           TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
  10.           collisions:0 txqueuelen:0 
  11.           RX bytes:460 (460.0 b)  TX bytes:468 (468.0 b)



启动docker后台服务:


  1. # service docker start
  2. Starting cgconfig service:                                 [  OK  ]
  3. Starting docker:                                           [  OK  ]
  4. # chkconfig docker on


后台服务启动检查:

  1. #ps -ef | grep docker
  2. root     15982     1  0 10:33 pts/1    00:00:00 /usr/bin/docker -d
  3. root     16154 15286  0 10:35 pts/1    00:00:00 grep docker
  4. # chkconfig --list | grep docker
  5. docker          0:off   1:off   2:on    3:on    4:on    5:on    6:off


3、获取镜像:

注:12.04为笔记【1】中的内容,呼应一下,不过我们应用主要跑在centos下,所以后续的主要实操会基于centos 6.8

  1. # docker pull ubuntu:12.04
  2. 12.04: Pulling from ubuntu
  3. 94bf32934729: Pull complete 
  4. 5e12b5525fb8: Pull complete 
  5. df24de65c977: Pull complete 
  6. 8cc279ff6556: Pull complete 
  7. 13c47942ea6e: Pull complete 
  8. cfc2576a1531: Pull complete 
  9. Digest: sha256:6ab19ca6ef048136b8aeb513e6fb715c005fd671a536039567b1d261f2f0779e
  10. Status: Downloaded newer p_w_picpath for ubuntu:12.04
  11. # docker pull centos:6.8
  12. 6.8: Pulling from centos
  13. 3690474eb5b4: Pull complete 
  14. 386c6db8c14f: Pull complete 
  15. 8986abc42d08: Pull complete 
  16. 80e46367f846: Pull complete 
  17. Digest: sha256:233cbc13832f97e83773d2e4a6f9f3a81959bc9b5c1b03135d6bbd67a9db8b66
  18. Status: Downloaded newer p_w_picpath for centos:6.8


本地镜像检查:

  1. # docker p_w_picpaths
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. ubuntu              12.04               cfc2576a1531        6 weeks ago         103.6 MB
  4. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB


4、扩展:


time命令,可以统计某个命令执行耗时,如下,可看出docker启动一个echo应用,约3s:

  1. time docker run centos:6.8 /bin/echo what
  2. what
  3. real    0m2.645s
  4. user    0m0.031s
  5. sys     0m0.027s


通过镜像启动一个docker实例,整个过程约3s:

启动echo应用输出一个what,效率略低于直接在本地执行:


  1. # docker run centos:6.8 /bin/echo what
  2. what


启动bash交互界面,启动过程约3-5s可以通过ps看出,启动十分轻量级

  1. # docker run -t -i centos:6.8 /bin/bash
  2. [root@ec600b17b4ad /]# ls
  3. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
  4. [root@ec600b17b4ad /]# ps -ef
  5. UID        PID  PPID  C STIME TTY          TIME CMD
  6. root         1     0  0 02:42 ?        00:00:00 /bin/bash
  7. root        12     1  0 02:42 ?        00:00:00 ps -ef
  8. [root@ec600b17b4ad /]# pwd
  9. /


5、修改镜像:


终端1【不要exit】:

  1. #docker run -t -i centos:6.8 /bin/bash
  2. [root@ec600b17b4ad /]# yum install lrzsz
  3. Loaded plugins: fastestmirror, ovl
  4. Setting up Install Process
  5. Determining fastest mirrors
  6.  * base: mirrors.btte.net
  7.  * extras: mirrors.btte.net
  8.  * updates: mirrors.tuna.tsinghua.edu.cn
  9. Resolving Dependencies
  10. --> Running transaction check
  11. ---> Package lrzsz.x86_64 0:0.12.20-27.1.el6 will be installed
  12. --> Finished Dependency Resolution
  13. Dependencies Resolved
  14. =================================================================================================================================
  15.  Package                                         Arch                                             Version                                                     Repository                                      Size
  16. =================================================================================================================================
  17. Installing:
  18.  lrzsz                                           x86_64                                           0.12.20-27.1.el6                                            base                                            71 k
  19. Transaction Summary
  20. =================================================================================================================================
  21. Install       1 Package(s)
  22. Total download size: 71 k
  23. Installed size: 159 k
  24. Is this ok [y/N]: y
  25. Downloading Packages:
  26. lrzsz-0.12.20-27.1.el6.x86_64.rpm                                                                                                                                                           |  71 kB     00:00     
  27. warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
  28. Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
  29. Importing GPG key 0xC105B9DE:
  30.  Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
  31.  Package: centos-release-6-8.el6.centos.12.3.x86_64 (@CentOS/6.8)
  32.  From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
  33. Is this ok [y/N]: y
  34. Running rpm_check_debug
  35. Running Transaction Test
  36. Transaction Test Succeeded
  37. Running Transaction
  38.   Installing : lrzsz-0.12.20-27.1.el6.x86_64                                                                                                                                                                   1/1 
  39.   Verifying  : lrzsz-0.12.20-27.1.el6.x86_64                                                                                                                                                                   1/1 
  40. Installed:
  41.   lrzsz.x86_64 0:0.12.20-27.1.el6                                                                                                                                                                                  
  42. Complete!

终端2:

注意:

查看所有已经创建的container实例:

  1. #docker ps -a
  2. CONTAINER ID        IMAGE                                                              COMMAND                CREATED             STATUS                        PORTS               NAMES
  3. 17d146c6710d        centos:6.8.my.1                                                    "/bin/bash"            18 minutes ago      Exited (017 minutes ago                         kickass_swartz            
  4. 4bdb037d6f75        cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f   "/bin/sh -c 'yum -y    22 minutes ago      Exited (137) 20 minutes ago                       berserk_kilby             
  5. 8f2e422eb7ae        cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f   "/bin/sh -c 'yum ins   23 minutes ago      Exited (1) 22 minutes ago                         evil_mestorf              
  6. 11b3d795a062        centos:6.8.my                                                      "/bin/bash"            25 minutes ago      Exited (0) 24 minutes ago                         suspicious_mccarthy       
  7. e283711c5bdf        centos:6.8.my                                                      "/bin/bash"            26 minutes ago      Exited (1) 26 minutes ago                         stupefied_cori            
  8. 4a74b6b158f0        centos:6.8.my                                                      "/bin/bash"            35 minutes ago      Exited (0) 31 minutes ago                         backstabbing_mcclintock   
  9. ec600b17b4ad        centos:6.8                                                         "/bin/bash"            42 minutes ago      Exited (0) 35 minutes ago                         loving_lovelace           
  10. 8864174c48ea        centos:6.8                                                         "/bin/bash"            47 minutes ago      Exited (0) 46 minutes ago                         jolly_torvalds            
  11. 591e0f5c1817        centos:6.8                                                         "/bin/bash"            49 minutes ago      Exited (0) 49 minutes ago                         cranky_torvalds           
  12. bc2496541488        centos:6.8                                                         "/bin/echo what"       50 minutes ago      Exited (0) 50 minutes ago                         fervent_cori              
  13. 2b7ee7dc7a4d        centos:6.8                                                         "/bin/bash"            52 minutes ago      Exited (0) 51 minutes ago                         focused_bartik            
  14. f144b72eb4ab        centos:6.8                                                         "/bin/echo what"       54 minutes ago      Exited (0) 54 minutes ago                         elegant_bohr              
  15. 547b76094492        centos:6.8                                                         "/bin/echo what"       54 minutes ago      Exited (0) 54 minutes ago                         sad_poitras  
  16. 查看CONTAINER ID 
  17. # docker ps
  18. CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
  19. ec600b17b4ad        centos:6.8          "/bin/bash"         About a minute ago   Up About a minute                       loving_lovelace

通过运行中的CONTAINER创建镜像centos:6.8.my,返回的id为镜像的唯一id

  1. # docker commit -m "ADDed lrzsz" -a "Docker my-a" ec600b17b4ad centos:6.8.my
  2. c24da2edd993ebbbbabb81ab349f2146813ea34f9f87821630fd13ad1ab4c745

罗列所有可用镜像:

  1. # docker p_w_picpaths
  2. REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
  3. centos              6.8.my              c24da2edd993        About a minute ago   255 MB
  4. ubuntu              12.04               cfc2576a1531        6 weeks ago          103.6 MB
  5. centos              6.8                 80e46367f846        10 weeks ago         194.5 MB

使用修改的镜像启动容器实例:

如下可见,刚才在容器通过yum安装的软件已经包含在了自己创建的镜像。

  1. # docker run -t -i centos:6.8.my /bin/bash
  2. [root@4a74b6b158f0 /]# rpm -qa | grep lrzsz
  3. lrzsz-0.12.20-27.1.el6.x86_64

6、创建docker镜像:


->1、使用Dockerfile:

创建目录和makefile文件:

  1. #mkdir p_w_picpath_maker_sinatra
  2. #cd p_w_picpath_maker_sinatra
  3. #touch Dockerfile

确认镜像中不存在my.tag的文件

  1. # docker run -t -i centos:6.8.my /bin/bash
  2. [root@e283711c5bdf /]# ls
  3. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
  4. [root@e283711c5bdf /]# exit
  5. exit

Dockerfile内容:

  1. #cenos:6.8.my.1 maker
  2. FROM centos:6.8.my
  3. MAINTAINER Docker lich <lich@lichdiamond.win>
  4. RUN echo "my tag" > my.tag

执行新建镜像:

  1. # docker build -t "centos:6.8.my.1"  .
  2. Sending build context to Docker daemon 2.048 kB
  3. Sending build context to Docker daemon 
  4. Step 0 : FROM centos:6.8.my
  5.  ---> c24da2edd993
  6. Step 1 : MAINTAINER Docker lich <lich@lichdiamond.win>
  7.  ---> Using cache
  8.  ---> cbbdcb29ca21
  9. Step 2 : RUN echo "my tag" > my.tag
  10.  ---> Running in f89b6bc65148
  11.  ---> 3ebfbda17fb8
  12. Removing intermediate container f89b6bc65148
  13. Successfully built 3ebfbda17fb8

查看所有centos镜像:

  1. # docker p_w_picpaths centos
  2. REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
  3. centos              6.8.my.1            3ebfbda17fb8        About a minute ago   255 MB
  4. centos              6.8.my              c24da2edd993        19 minutes ago       255 MB
  5. centos              6.8                 80e46367f846        10 weeks ago         194.5 MB

使用新镜像启动docker容器,检验内容:

如下内容可以看出,6.8.my中的lrzsz存在,并且Dockerfile中指定生成的文件、以及其内容都存在:

  1. # docker run -t -i centos:6.8.my.1 /bin/bash
  2. [root@17d146c6710d /]# ls
  3. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  my.tag  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
  4. [root@17d146c6710d /]# cat my.tag 
  5. my tag
  6. [root@17d146c6710d /]# rpm -qa | grep lrzsz
  7. lrzsz-0.12.20-27.1.el6.x86_64
  8. [root@17d146c6710d /]# exit
  9. exit

-2>使用openvz【容器虚拟化的先锋技术】创建镜像:

先下载镜像【可能需要跳出墙外,这个网址在国内的访问速度几乎为0】:

#wget https://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz

使用的时候报错了,这个错误的原因是下载的文件有问题,不完整或者有损坏:

  1. # cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8
  2. Error response from daemon: ApplyLayer exit status 1 stdout:  stderr: unexpected EOF

重新下载之后,导入完成

  1. # cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8
  2. 35b7ec25ed6f9657ff7581a8c7643c2ce48d1b892eac6116b783b43fc8fd9bfc

docker attach的时候执行了一个exit,导致主机除了一些问题:

报错:

  1. # docker pull centos:6.8
  2. Pulling repository centos
  3. Get https://index.docker.io/v1/repositories/library/centos/p_w_picpaths: dial tcp: lookup index.docker.io: Temporary failure in name resolution

解决:

重新登录一下

【由于之前系统出现了一些问题,所以删除了部分p_w_picpath,现有p_w_picpath如下,可见my_centos:6.8已经在本地仓库了】

  1. # docker p_w_picpaths
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. my_centos           6.8                 35b7ec25ed6f        36 minutes ago      343.8 MB
  4. ubuntu              12.04               cfc2576a1531        6 weeks ago         103.6 MB
  5. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB

7、镜像导出、导入:

导出【需要本地存在该镜像,如果不存在,请先pull下来】:

  1. # docker save -o centos_68my1.tar centos:6.8.my.1
  2. # ll
  3. total 256636
  4. -rw-r--r-- 1 root root 262789632 Nov 10 11:31 centos_68my1.tar  .
  5. # du -sh *
  6. 251M    centos_68my1.tar

导入:

1、导入会校验id,如果一样就不导入了,所以要删除创建时候使用的镜像centos:6.8.my.1:

  1. # docker p_w_picpaths centos
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. centos              6.8.my.1            3ebfbda17fb8        22 minutes ago      255 MB
  4. centos              6.8.my              c24da2edd993        39 minutes ago      255 MB
  5. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB
  6. # docker rmi 3ebfbda17fb8
  7. Error response from daemon: Conflict, cannot delete 3ebfbda17fb8 because the container 17d146c6710d is using it, use -f to force
  8. Error: failed to remove p_w_picpaths: [3ebfbda17fb8]

报错信息指向一个容器,说又通过该镜像启动的容器实例,因此我们需要使用-f命令强制删除镜像和通过该镜像创建的所有实例

  1. # docker rmi -f 3ebfbda17fb8
  2. Untagged: centos:6.8.my.1
  3. Deleted: 3ebfbda17fb85e28ae24faa77cf8d7811e0068f428a4763042708b15d00ee2aa
  4. Deleted: cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f

可以看到,centos:6.8.my.1被删除了

  1. # docker p_w_picpaths centos
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. centos              6.8.my              c24da2edd993        42 minutes ago      255 MB
  4. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB

2、删除后,进行导入操作:

# docker load --input centos_68my1.tar

可以看到导入之后镜像库里面的镜像就回来了

  1. # docker p_w_picpaths centos
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  3. centos              6.8.my.1            3ebfbda17fb8        25 minutes ago      255 MB
  4. centos              6.8.my              c24da2edd993        43 minutes ago      255 MB
  5. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB
  6. 修改镜像的TAG:
  7. centos:6.8.my.1
  8. centos:6.8.my
  9. 这样的TAG不够明显,修改一下:
  10. 首先查出p_w_picpath对应id
  11. # docker p_w_picpaths centos
  12. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  13. centos              6.8.my.1            3ebfbda17fb8        25 minutes ago      255 MB
  14. centos              6.8.my              c24da2edd993        43 minutes ago      255 MB
  15. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB
  16. 修改TAG:
  17. # docker tag c24da2edd993 my_centos:11.10.1
  18. # docker tag 3ebfbda17fb8 my_centos:11.10.2
  19. # docker p_w_picpaths centos
  20. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  21. centos              6.8.my.1            3ebfbda17fb8        29 minutes ago      255 MB
  22. centos              6.8.my              c24da2edd993        47 minutes ago      255 MB
  23. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB
  24. # docker p_w_picpaths my_centos
  25. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  26. my_centos           11.10.2             3ebfbda17fb8        29 minutes ago      255 MB
  27. my_centos           11.10.1             c24da2edd993        47 minutes ago      255 MB

从结果可以看出,好像是创建了两个新的镜像,实际上仔细观察就会发现他们的IMAGE ID 是一样的,也就是说,相当于创建了两个不一样名字的快捷方式,其实实体p_w_picpath还是同一个!

删除镜像:

在导入的时候由于需要删除再导入,已经介绍了,就不演示了

注意点:

docker rm 是删除依赖于这个镜像所有的docker容器的命令

docker rmi执行前,需要先执行docker rm 或者  在rmi后面加上-f 强制删除参数,将会删除镜像以及镜像创建出的所有容器!

8、守护态启动容器:

  1. # docker run -d my_centos:11.10.1 /bin/sh -c "while true;do echo what is your name;sleep 1;done"
  2. f00717ca5c5eb4e449181bb99b98e8e86910b957ceda82f31e5440bf61cef979

查看运行中实例:

  1. # docker ps
  2. CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
  3. f00717ca5c5e        my_centos:11.10.1   "/bin/sh -c 'while t   39 seconds ago      Up 37 seconds                           serene_cray

查看容器输出内容

  1. # docker logs serene_cray
  2. what is your name
  3. what is your name
  4. what is your name
  5. 或者
  6. # docker logs f00717ca5c5e
  7. what is your name
  8. what is your name
  9. what is your name

9、终止运行中容器:

docker stop后面可以跟上id 也可是names

  1. # docker stop serene_cray
  2. serene_cray
  3. # docker ps
  4. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

10、进入守护态容器:

启动一个守护态容器:

  1. # docker run -t -i -d my_centos:11.10.1 /bin/bash
  2. 3e4c55543d86c86961c3d0f1d7b8af212a8943e9a6c58171c61e7b5fe98fbf29
  3. # docker ps
  4. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  5. 3e4c55543d86        my_centos:11.10.1   "/bin/bash"         4 seconds ago       Up 2 seconds                            agitated_albattani

1、attach进入【命令完了需要多敲回车】:

  1. # docker attach agitated_albattani
  2. [root@3e4c55543d86 /]# ls
  3. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
  4. [root@3e4c55543d86 /]# uname -a
  5. 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
  6. [root@3e4c55543d86 /]# cat /etc/issue
  7. CentOS release 6.8 (Final)
  8. Kernel \r on an \m

注:exit命令会导致容器终止!只推出attach 使用  ctrl+p 之后 ctrl+q即可推出attach  而不终止容器

2、nsenter进入:

确认版本:

  1. # nsenter  -V
  2. nsenter from util-linux-ng 2.17.2
  3. 查看docker后台运行容器的第一pid:
  4. # docker inspect --format "{{ .State.Pid }}" 43a81bd378f9
  5. 12590

将.bashrc_docker 内容加到.bashrc中

  1. #wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker
  2. #echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

连接到后台运行的docker容器

【此方式可以使用exit,并且多个人登录获得的终端不是同步的】

  1. # nsenter --target 12590 --mount --uts --ipc --net --pid
  2. [root@43a81bd378f9 /]# ls
  3. bin  boot  dev  etc  fastboot  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
  4. [root@43a81bd378f9 /]# mpstat
  5. -bash: mpstat: command not found
  6. [root@43a81bd378f9 /]# vmstat
  7. procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
  8.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  9.  0  0      0 27886420  65100 933628    0    0    28    31   27   33  0  0 99  1  0
  10. [root@43a81bd378f9 /]# free -g
  11.              total       used       free     shared    buffers     cached
  12. Mem:            31          4         26          0          0          0
  13. -/+ buffers/cache:          3         27
  14. Swap:            0          0          0
  15. [root@43a81bd378f9 /]# exit
  16. logout

11、运行中的容器快照导出,还原为镜像:

导出:

#docker export 43a81bd378f9 > my_centos.tar

导入【将当时的快照状态还原成镜像,不包括元数据和历史记录等】:

  1. # cat my_centos.tar| docker import - my_centos:6.8.0
  2. 8247cb10fde2c99f1febfa11d5729175fb5be9afdbdf3fb581d20259e9fcd392
  3. # docker p_w_picpaths
  4. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  5. my_centos           6.8.0               8247cb10fde2        28 seconds ago      343.8 MB
  6. my_centos           6.8                 35b7ec25ed6f        53 minutes ago      343.8 MB
  7. ubuntu              12.04               cfc2576a1531        6 weeks ago         103.6 MB
  8. centos              6.8                 80e46367f846        10 weeks ago        194.5 MB

12、删除容器:

docker ps

1终止状态容器

  1. # docker rm  43a81bd378f9
  2. 43a81bd378f9

2运行中容器:

  1. # docker rm -f 43a81bd378f9
  2. 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方式:

  1. yum install -y python-devel libevent-devel python-pip gcc xz-devel
  2. pip install docker-registry

也可下载源码进行安装:

  1. git clone https://github.com/docker/docker-registry.git
  2. cd docker-registry
  3. 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

提交指定容器到私有仓库:

  1. docker tag ubuntu:12.04 私有库IP:5000/ubuntu:12.04
  2. docker push 私有库IP:5000/ubuntu

从指定服仓库下载:

docker pull ${REPOSITORY}:${TAG}

自动上传本地所有p_w_picpath到本地的镜像,默认的服务器为127.0.0.1:5000:

  1. wget https://github.com/yeasy/docker_practice/raw/master/_local/push_p_w_picpaths.sh
  2. chmod a+x push_p_w_picpaths.sh
  3. ./push_p_w_picpaths.sh

查看私服中的所有镜像:

curl 私有库IP:5000/v1/search

返回的是json,里面的镜像列表

仓库配置文件【默认配置文件中】:

Docker的registry利用配置文件提供了一些仓库的模板,flavor,用户可以直接使用它们进行开发或者测试生产的部署

配置文件模板解释:

  1. common :基础配置
  2. ocal :存储数据到本地文件系统 
  3. s3 :存储数据到 AWS S3 中 
  4. dev :使用  
  5. local  模板的基本配置 
  6. test :单元测试使用
  7. prod :生产环境配置(基本上跟s3配置类似) 
  8. gcs :存储数据到 Google 的云存储 
  9. swift :存储数据到 OpenStack Swift 服务
  10. glance :存储数据到 OpenStack Glance 服务,本地文件系统为后备 
  11. glance-swift :存储数据到 OpenStack Glance 服务,
  12. Swift 为后备 
  13. elliptics :存储数据到 Elliptics key/value

用户也可以自定义模板段

默认使用的模板是dev,要使用某个模板作为默认值,添加SETTINGS_FLAVOR到环境变量例如:

export SETTINGS_FLAVOR=dev

文件中,支持环境变量中加载某些值:

_env:VARIABLENAME[:DEFAULT]

文件示例:

  1. common:
  2. loglevel:info
  3. search_backend:"_env:SEARCH_BACKEND:"
  4. sqlalchemy_index_database:"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:tmp/docker-registry.db"
  5. prod:
  6. loglevel:warnstorage:s3
  7. s3_access_key:_env:AWS_S3_ACCESS_KEY
  8. s3_secret_key:_env:AWS_S3_SECRET_KEY
  9. s3_bucket:_env:AWS_S3_BUCKET
  10. boto_bucket:_env:AWS_S3_BUCKET
  11. storage_path:/srv/docker
  12. smtp_host:localhost
  13. from_addr:docker@myself.com
  14. to_addr:my@myself.com
  15. dev:
  16. loglevel:debugstorage:local
  17. storage_path:/home/myself/docker
  18. test:
  19. storage:local
  20. 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:

  1. docker run -it -v /dbdata:/dbdata --name dbdata training/postgres centos
  2. #docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container fo...

创建其他容器时,使用--volumes-from来挂在dbdata中的数据卷

  1. docker run -d --volumes-from dbdata --name db1 training/postgres
  2. 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的端口到内部容器开放的端口

  1. docker run -d -P training/webapp python app.py
  2. 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. 注意:
  2. 1、容器有自己的内部网络和ip地址【使用docker inspect 可以获取所有变量。Docker还可以有一个可变的网络配置】
  3. 2、-p可以使用多次来绑定多个端口:
  4. 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 容器使用,前缀采用大写的连接别名。

  1. docker run -t -i --rm --link db:db training/webapp /bin/bash
  2. cat /etc/hosts

里面会有两个一个是当前容器的name解析  一个是link的容器的name解析

用户可以连接多个子容器到父容器。