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)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 lichRUN 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---> 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:[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解析
用户可以连接多个子容器到父容器。