@会网络的老鼠

涂飞平的博客空间

Docker实践笔记(小赵同学的笔记)

1 年前 0

这是一篇关于Docker的学习笔记。
docker
我的同事赵郭桃在最近整理某个项目测试环境的时候,希望使用Docker进行测试环境整体部署!
从开始学习到最终部署成功,经过近一周的实践,学习,整理出此篇学习笔记。里面包含几乎所有的docker基础指令,可以作为入门备查资料。

Docker安装与配置:

1、OS环境:
Ubuntu;
系统版本号:Ubuntu 16.04.1 LTS;
内核版本号:Linux version 4.4.0-31-generic (buildd@lgw01-16) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) ) #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016;

2、安装(注意,docker命令基本都是sudo,下同):
2.1 安装Docker:$ sudo apt-get install -y docker.io
2.2 查看docker版本:$ docker --version
$ Docker version 1.12.1, build 23cf638

2.3 下载ubuntu镜像:
$ sudo docker pull ubuntu
相当于默认从docker hub下载:$ sudo docker pull registry.hub.docker.com/ubuntu:latest
也可以自定义下载的仓库:$ sudo docker pull dl.dockerpool.com:5000/ubuntu:latest
国外仓库速度相对比较慢,所以把repository配置到国内速度相对比较快。
1) 在DaoCloud.io上面注册了一个账号,然后配置:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://xxx.m.daocloud.io
$ sudo systemctl restart docker.service
2) 在Aliyun上注册加速器:https://cr.console.aliyun.com
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo tee /etc/systemd/system/docker.service.d/mirror.conf <<-'EOF'
$ [Service]
$ ExecStart= ExecStart=/usr/bin/docker daemon -H fd:// --registry-mirror=https://xxx.mirror.aliyuncs.com
$ EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
2.4 查看docker镜像:
$ sudo docker images:列出镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f753707788c5 4 weeks ago 127.2 MB
$ sudo docker inspect f753707788c5:查看镜像详细信息(详见docker-inspect.txt)
2.5 启动这个镜像:$ sudo docker run -t -i f753707788c5 /bin/bash
(-t 表示开一个tty,-i 表示保持打开标准输入)
查看进程:$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 18244 3228 ? Ss 04:08 0:00 /bin/bash
root 14 0.0 0.0 34424 2860 ? R+ 04:09 0:00 ps aux
2.6* 退出镜像:$ exit
2.7 查看docker进程:
退出之后查看进程:什么都没有,说明彻底关了
$ sudo docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ sudo docker ps -a:
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
e8f0df177d4d f753707788c5 "/bin/bash" About a minute ago Exited (130) 10 seconds ago gigantic_roentgen

3、搜索镜像:
$ sudo docker search mysql

4、创建镜像:
4.1 先运行一个镜像
$ docker run -t -i f753707788c5 /bin/bash
在镜像中做一些操作
root@1213d4528bfb:/# touch NewFile
4.2 记住刚刚容器的ID并作为新的提交
$ sudo docker commit -m '# add a new file' -a 'zachory' 1213d4528bfb test
4.3 查看,就有了新的容器
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 041ac39d2b05 15 seconds ago 127.2 MB

5、删除容器:
$ sudo docker rmi test:latest

6、镜像存出和载入:
存出:$ sudo docker save -o tst.tar test:latest
载入:$ sudo docker load --input tst.tar

7、镜像上传:
7.1 登陆
先在https://hub.docker.com/上注册一个用户
$ sudo docker login
之后输入用户名、密码
7.2 填加标签:
$ sudo docker tag test:latest zachory/test:latest
7.3 上传:
$ sudo docker push zachory/test:latest


Docker容器相关:

8、创建容器:
$ sudo docker create -it ubuntu:latest,之后docker ps -a 可查看新容器

9、启动容器:
方式一:$ sudo docker run ubuntu /bin/echo 'hello world'
方式二:$ sudo docker create ---> $ sudo docker start
9.1 docker run 创建启动容器,后台运行操作:
1) 检查本地是否有该镜像,不存在则下载
2) 利用镜像创建并启动一个新容器
3) 分配一个文件系统,并在只读只写的镜像外面挂一层可读可写层
4) 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5) 从地址池分配一个ip给容器
6) 执行用户指定的应用程序
7) 执行完毕后容器终止
9.2 守护状态运行:
$ sudo docker run -d ubuntu /bin/echo hello world
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
其中,-d 表示在后台守护进程运行,但是,1命令运行完指定的echo之后容器自动停止,2命令中写了个死循环,让他保持运行,那么他就不会运行完,也就不会退出。

10、终止容器
$ sudo docker stop e8f0df177d4d
首先向容器发送 SIGTERM 信号,等待_默认10_秒后,再发送 SIGKILL 信号。
$ sudo docker stop -t=1 e8f0df177d4d:等待_1秒_即可停止,加 -t 表示等待时间

11、重启容器:
$ sudo docker restart e8f0df177d4d
即先结束,再启动

12、进入容器:
12.1 attach:$ sudo docker attach Container-ID或NAME都可以
12.2 exec:$ sudo docker exec -ti Container-ID或NAME都可以 /bin/bash

13、删除容器:
$ sudo docker rm e8f0df177d4d
1) -f: --force=false 强行终止并删除一个运行中的容器
2) -l: --link=false 删除容器连接,但保留容器
3) -v: --volumes=false 删除容器挂载的数据卷
$ sudo docker run --rm ubuntu:latest:容器运行结束即删除

14、容器相关命令:
1) $ sudo docker logs e8f0df177d4d:查看容器运行日志,跟容器的唯一标识即可
2) $ sudo docker ps:查看当前正在运行的容器
3) $ sudo docker ps -a:查看运当前停止运行的容器
4) $ sudo docker ps (-a) -q:加 -q 只查看ID
5) $ sudo docker export e8f0df177d4d >test_exp.tar:导出一个容器
6) $ cat test_exp.tar | sudo docker import - test/ubuntu:latest:导入一个容器

Docker仓库相关:

说明:注册器(Registry)是存放仓库的具体服务器;仓库(Repository)是存放镜像的地方,分为公共仓库和私有仓库。

15、Docker Hub
15.1 官方库: https://hub.docker.com
15.2 访问国外网站慢,可以指定国内的镜像地址:/etc/docker/daemon.json
15.3 搜索镜像:git search; 下载镜像:git pull;

16、自定义docker仓库
$ sudo docker pull 仓库地址:端口/镜像:版本

17、Private Repository:使用本地库
1) 先使用registry镜像创建一个私有repository
$ sudo docker run -d -p 5000:5000
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45aa4043255f registry "/entrypoint.sh /etc/" 24 minutes ago Up 24 minutes 0.0.0.0:5000->5000/tcp silly_darwin
2) 把想要上传的镜像更改host标记(仓库/名称:tag)
$ sudo docker tag registry:latest 127.0.0.1:5000/reg
3) 上传成功后下载
$ sudo docker pull 127.0.0.1:5000/reg
4) 注意,如果报错,可以试着关闭防火墙:sudo service ufw stop
查询docker相关文件:sudo find / -name docker*

Docker数据管理相关:

18、数据卷:
18.1 数据卷即绕过文件系统的目录,特性如下:
1) 可以在容器之间共享和重用
2) 对数据卷的修改会立马生效
3) 对数据卷的更新不影响镜像
4) 卷会一直存在直到没有容器
18.2 数据卷:
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
说明:-P 表示暴露端口
-v 表示在容器内创建一个数据卷
先运行起一个镜像, 再创建一个数据卷:/webapp
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp(:ro) training/webapp python app.py
说明:起一个镜像,创建一个/opt/webapp数据卷,将本地/src/webapp挂载进去,加:ro表示挂在进去的只读
$ sudo docker run --rm -it -v ~/.bash_history:./bash_history test:latest /bin/bash
说明:挂载一个文件到容器中作为数据卷
18.3 数据卷容器:为了实时更新数据,专门起一个供其它公用挂载的数据卷
1) 跑test镜像,名字是 dbdata,起一个数据卷容器,挂载到 /home/zgt/docker
$ sudo docker run -it -v /home/zgt/docker/dbdata --name dbdata test
2) 跑test镜像,名字是 db1,挂到name为dbdata数据卷上
$ sudo docker run -it --volumes-from dbdata --name db1 test
跑test镜像,名字是 db2,挂到name为dbdata数据卷上
$ sudo docker run -it --volumes-from dbdata --name db2 test
… …
3) 在已经启动的各个容器的数据卷中增加或减少数据达到同步更新的作用,而主数据卷可以不启动
18.4 迁移数据
1) 备份数据:先跑一个test镜像,让它挂载到有数据卷容器的dbdata上,使用 -v a:b 让本地当前路径挂载到新跑的这个镜像的/backup路径下,执行就可以把/home/zgt/docker/dbdata压缩到/backup
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name backer test tar cvf /backup/backup.tar /home/zgt/docker/dbdata
2) 恢复数据:
跑test镜像,名字是 dbackup,起一个数据卷容器,挂载到 /dbdata
$ sudo docker run -v /dbdata --name dbackup test /bin/bash
跑一个执行解压命令的test镜像,并解压到挂载的卷中
$ sudo docker run --volumes-from dbackup -v $(pwd):/backup test tar xvf /backup/backup.tar
ps:也可以跑一个/bin/bash的test镜像,自己进去解压
先进去:
$ sudo docker run -ti --volumes-from dback-tst -v $(pwd):/backup test /bin/bash
再解压:
$ tar xvf /backup/backup.tar

Docker数据网络相关:

19、端口映射配置:
19.1 -P表示随机映射一个
$ sudo docker run -d -P training/webapp python app.py
19.2 hostPort:ContainerPort:
映射所有端口地址:$ sudo docker run -d -p 5000:5000 training/webapp python app.py
绑定多个端口地址:$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
19.3 ip:hostPort:containerPort:
映射到地址指定的端口:$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
19.4 ip:containerPort:映射到指定地址的任意端口
容器5000映射到本地任意分配端口:$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
指定udp端口:$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

20、查询端口配置:
$ sudo docker logs tiny_golick:
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
$ sudo docker port tiny_golick:
5000/tcp -> 0.0.0.0:32770
or
5000/udp -> 127.0.0.1:5000
$ sudo docker port tiny_golick 5000
0.0.0.0:32770
or
Error: No public port '5000/tcp' published for hopeful_bose
$ sudo docker inspect -f "{{.ContainerConfig.ExposedPorts}}" 6fae60ef3446
map[5000/tcp:{}]

21、容器互联通信
1) 启动一个docker容器
$ sudo docker run -d --name db training/postgres
2) 再启动一个与其连通:
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
说明:--link name:alias 即想要连通的容器名称:别名,这样内部就可以连通了
3) 查看连通情况:
3.1 环境变量:$ sudo docker run -rm --name web2 --link db:db training/webapp
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a60885f96a33
/*以下DB_开头的为db容器使用的*/
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
3.2 通过进入容器查看hosts文件:
$ sudo docker run -ti --rm --link db:db training/webapp /bin/bash
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 db ad1c61dffac6
172.17.0.7 706d4d876bec
此时可以看到有个db的ip和hostname,还有自己的ip和hostname,说明自己之间是可以通信的,测试一下:
$ apt-get install -yqq inetutils-ping (pull下来的ubuntu镜像是没有ping的,需要自己下载一个)
$ ping db
PING db (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.136 ms
64 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.144 ms
64 bytes from 172.17.0.5: icmp_seq=3 ttl=64 time=0.082 ms
^C--- 706d4d876bec ping statistics ---
4 packets transmitted, 3 packets received, 0% packet loss
$ ping 706d4d876bec
PING 706d4d876bec (172.17.0.7): 56 data bytes
64 bytes from 172.17.0.7: icmp_seq=0 ttl=64 time=0.072 ms
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.128 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.099 ms
^C--- 706d4d876bec ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss

Dockerfile相关:

22、Dockerfile基本结构:

##基础镜像信息
FROM ubuntu
##维护者信息
MAINTAINER zgt zgt@gmail.com
##操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/source.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
##容器启动执行指令
CMD /usr/sbin/nginx

23、创建镜像:
创建一个 tag 为 "build_repo/first_image" 的并且Dockerffile在 /tmp/docker_builder/ 下的镜像:
$ sudo docker build -t build_repo/first_image /tmp/docker_builder/
注意:执行build指令会扫描改路径下所有Dockerfile,所以一般为单个Dockerfile

编写评论