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 p_w_picpath 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 p_w_picpath for centos:6.8
本地镜像检查:
- # docker p_w_picpaths
- 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) <centos-6-key@centos.org>
- 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 p_w_picpaths
- 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 p_w_picpath_maker_sinatra
- #cd p_w_picpath_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 <lich@lichdiamond.win>
- 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 <lich@lichdiamond.win>
- ---> Using cache
- ---> cbbdcb29ca21
- Step 2 : RUN echo "my tag" > my.tag
- ---> Running in f89b6bc65148
- ---> 3ebfbda17fb8
- Removing intermediate container f89b6bc65148
- Successfully built 3ebfbda17fb8
查看所有centos镜像:
- # docker p_w_picpaths 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/p_w_picpaths: dial tcp: lookup index.docker.io: Temporary failure in name resolution
解决:
重新登录一下
【由于之前系统出现了一些问题,所以删除了部分p_w_picpath,现有p_w_picpath如下,可见my_centos:6.8已经在本地仓库了】
- # docker p_w_picpaths
- 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 p_w_picpaths 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 p_w_picpaths: [3ebfbda17fb8]
报错信息指向一个容器,说又通过该镜像启动的容器实例,因此我们需要使用-f命令强制删除镜像和通过该镜像创建的所有实例
- # docker rmi -f 3ebfbda17fb8
- Untagged: centos:6.8.my.1
- Deleted: 3ebfbda17fb85e28ae24faa77cf8d7811e0068f428a4763042708b15d00ee2aa
- Deleted: cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f
可以看到,centos:6.8.my.1被删除了
- # docker p_w_picpaths 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 p_w_picpaths 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不够明显,修改一下:
- 首先查出p_w_picpath对应id:
- # docker p_w_picpaths 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 p_w_picpaths 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 p_w_picpaths 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 是一样的,也就是说,相当于创建了两个不一样名字的快捷方式,其实实体p_w_picpath还是同一个!
删除镜像:
在导入的时候由于需要删除再导入,已经介绍了,就不演示了
注意点:
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 p_w_picpaths
- 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}
自动上传本地所有p_w_picpath到本地的镜像,默认的服务器为127.0.0.1:5000:
- wget https://github.com/yeasy/docker_practice/raw/master/_local/push_p_w_picpaths.sh
- chmod a+x push_p_w_picpaths.sh
- ./push_p_w_picpaths.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:docker@myself.com
- to_addr:my@myself.com
- 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解析
用户可以连接多个子容器到父容器。