docker自己才能看懂的笔记
1.1 docker改名moby
1.2 安装
yum install –y docker systemctl enable docker
1.3 修改源
vim /usr/lib/systemd/system/docker.service
源上阿里去https://cr.console.aliyun.com
ExecStart=/usr/bin/dockerd-current --registry-mirror= systemctl daemon-reload systemctl start docker systemctl status docker
1.4 基础命令
docker pull alpine # 拉取镜像 docker search nginx # 搜索镜像 docker pull docker.io/nginx # nginx镜像 docker images # 查看本地镜像 docker save nginx > /tmp/nginx.tar.gz # 导出 docker rmi nginx # 删除镜像 docker load < /tmp/nginx.tar.gz # 导入
镜像位置/var/lib/docker/image/devicemapper/layerdb/
更换存储位置vim /usr/lib/systemd/system/docker.service
--graph=/opt/docker
dns服务
默认docker是采取宿主机dns
可以采用dns=xxxx的方式制定。
查看参数帮助
docker daemon –help
docker run apline sh # 启动镜像 # run = create + start docker run –it apline sh # 进行交互 docker ps # 正在运行容器 键盘ctrl +p+q # 推出时,保证容器继续运行,类似于screen 的 ctrl +a +d docker ps –a # 显示所有容器 docker rm id # 删除容器 docker rm 1526a29ab328 e895cb467506 2f07a0b8567c docker rm -f 1526a29ab328 # -f 强制删除 docker run -it --name mynginx nginx # 指定名字 docker inspect 142d3ffef2a7 # 查看详细信息
[root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 142d3ffef2a7 nginx "nginx -g 'daemon off" 11 seconds ago Up 10 seconds 80/tcp mynginx [root@linux-node1 ~]# docker inspect 142d3ffef2a7 docker run -it --rm --name mynginx nginx # 退出容器删除容器(实验环境使用) docker run -it --rm --name mynginx nginx sh # 进去交互界面 docker attach mynginx # 进入容器一。没有分配bash终端,所有终端命令一起显示。比较坑 docker exec mynginx docker exec -it mynginx sh # 进入容器二, 终端是独立。 推荐参数。其他少用。
yum install util-linux -y [root@linux-node1 ~]# cat docker_in.sh #!/bin/sh pid=`docker inspect --format "{{.State.Pid}}" $1` nsenter -t $pid -m -u -i -n -p sh docker_in.sh mynginx docker run -it -d --name mynginx nginx # 后台运行,于—rm参数有冲突 docker logs mynginx # 查看一条日志 docker logs -f mynginx # 跟tailf效果一样。可以直接使用ctrl + c退出 docker kill docker stop
1.5 镜像制作—镜像越小最好,少装包 简单方式
docker pull centos # 下载centos镜像 docker run -it centos bash # 进容器 yum install wget –y # 下载wget # 修改yum源 yum install nginx nginx 默认是后台运行的,docker不允许所以修改配置文件添加 vi /etc/nginx/nginx.conf daemon off; docker commit --help 制作镜像 docker commit -m 'add nginx images' romantic_williams ago/nginx docker commit -m 'add nginx images' romantic_williams ago/nginx:v1 # 打标签tag docker run -d --name ago_nginx ago/nginx:v1 nginx # 找v1镜像。不指定就是最后。 docker commit 容器 镜像名 http://hub.docker.com/ 镜像官网 docker login http://hub.docker.com/ # 登陆 docker images docker tag “IMAGE ID” docker.io/用户登陆名/名字 docker push docker.io/用户登陆名/名字 #
1.6 网络,端口映射
docker run -d --name agonginx -P nginx # -P 做端口映射
[root@linux-node1 ~]# [root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d4c723fd548 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp agonginx cb322488f58b centos "bash" 45 minutes ago Up 45 minutes romantic_williams bf87f4d14d3c nginx "nginx -g 'daemon off" 51 minutes ago Up 51 minutes 80/tcp mynginx 指定端口 小p docker run -d -p 8080:80 --name agonginx nginx # 前8080是宿主机的端口,也就是真实机。80是docker的端口,默认是tcp docker run -d -p 8080:80/udp --name agonginx nginx # 指定udp docker run -it -d -p 2222:22 -p 8888:80 -name centos centos bash # 指定多个端口 docker run -d -p 127.0.0.1:8080:80 --name agonginx nginx docker run -d -p 127.0.0.1::80 --name agonginx nginx 随机端口 容器互联 docker run -d -p 80:80 --name web1 nginx docker run --name web2 --link web1 -p 81:80 agonginx nginx # 互联web1 [root@linux-node1 ~]# docker exec -it web2 bash [root@b113ef47bbad /]# cd /etc/ [root@b113ef47bbad etc]# cat host cat: host: No such file or directory [root@b113ef47bbad etc]# cat 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.2 ago_nginx b906470e6e16 172.17.0.3 b113ef47bbad 方法二 docker run -d -p 81:80 --name web2 --link ago_nginx:shop_web ago/nginx nginx # 起别名 [root@linux-node1 ~]# docker exec -it web2 bash [root@d714a188bd28 /]# 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.2 shop_web b906470e6e16 ago_nginx 172.17.0.3 d714a188bd28 docker network ls [root@linux-node1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 16e4d130d169 bridge bridge local 1f2c0b5fb753 host host local bbebe8419703 none null local [root@linux-node1 ~]# docker run --rm -it --net=host nginx 2017/08/21 14:29:06 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) # 只有LO网卡 [root@linux-node1 ~]# docker run -it --rm --net=none alpine sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
1.7 跨主机互联
两个网段配置。
node1
修改配置文件--bip=172.18.42.1/16 添加这句 默认就是172.17 所以改成别的网段
vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-current --registry-mirror=https://u81vsg0g.mirror.aliyuncs.com --bip=172.18.42.1/16 systemctl daemon-reload systemctl restart docker
node2 vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-current --registry-mirror=https://u81vsg0g.mirror.aliyuncs.com --bip=172.18.42.1/16 \
互相ping,在宿主机即可。
ping 192.168.56.11
ping 192.168.56.12
启动docker容器
docker run -it --name node1 centos bash
docker run -it --name node2 centos bash
同时安装 yum install net-tools -y
因为虚拟机原因,可能一开始就会ping通
在宿主机添加路由,进行访问
route add -net 172.18.0.1/16 gw 192.168.56.11
抓包看看
tcpdump -i eth0 -vnn icmp
tcpdump -i docker0 -vnn icmp
1.8 数据管理
挂载
数据卷
docker rm -fv 容器名 # v 才会一起删除数据卷 docker run -it --name node1 --rm -v /data centos bash [root@603ab5d521d8 ~]# [root@603ab5d521d8 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/docker-8:3-34326325-4722a2e7b0560a72ad… 10G 236M 9.8G 3% / tmpfs 493M 0 493M 0% /dev tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/sda3 18G 2.3G 16G 13% /data shm 64M 0 64M 0% /dev/shm docker run -it --name node1 --rm -v /data:/opt centos bash # 前面是宿主机,后面是虚拟机 利用jenkins 可以直接推送过来。推送到/data下。 docker run -it --name node1 --rm -v /data/hosts:/opt/hosts centos bash # 文件的挂在尽可能不修改 文件,可能会修改inode号。 docker run -it --name node1 --rm -v /data/hosts:/opt/hosts:ro centos bash # 只读 docker run -it --name node01 --volumes-from node1 centos bash # 数据卷来自于谁。数据卷可以不启动虚拟机。
用 v 参数启动的。尽量用v参数删除。不然数据会一直增加。(自己测试一下。)
1.9 docker_file 文件名必须Dockerfile
[root@linux-node1 ~]# mkdir docker [root@linux-node1 ~]# cd docker/ [root@linux-node1 docker]# touch Dockerfile [root@linux-node1 docker]# vim Dockerfile [root@linux-node1 docker]# cat Dockerfile #This is dockerfile for nginx # 基于什么镜像 FROM centos # 维护者信息 MAINTAINER ago ago@163.com # 相关操作 # 下载epel源 装包越少越好 RUN rpm -ivh https://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-10.noarch.rpm # 坚决不能有交互 RUN yum install nginx -y # 添加文件 # 前面是宿主机路径文件,后者是虚拟机路径 ADD index.html /usr/share/nginx/html/index.html # 参数添加 RUN echo "daemon off;" >> /etc/nginx/nginx.conf # 设置开放端口 EXPOSE 80 # 执行命令 CMD ["nginx"] docker build -t ago/nginx /root/docker/ # docker构建也有缓存 docker images # 查看镜像 docker run -it --rm ago/nginx nginx # 启动测试
1.10 私有库 最简单的搭建方法
docker pull registry cd /opt mkdir auth docker run --entrypoint htpasswd registry -Bbn agocan 123456 > auth/htpasswd docker run -d -p 6000:5000 --restart=always --name registry1 \ -v `pwd`/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTTPSSWD_PATH=/auth/htpasswd \ registry 报错: Error response from daemon: Get http://127.0.0.1:6000/v1/users/: read tcp 127.0.0.1:42430->127.0.0.1:6000: \
read: connection reset by peer 上传镜像 docker tag 镜像ID 127.0.0.1:6000/ago/nginx docker push 127.0.0.1:6000/ago/nginx docker pull 127.0.0.1:6000/ago/nginx
1.11 docker容器编排
单机编排工具
yum install python-pip -y pip install docker-compose [root@linux-node1 opt]# docker-compose -v docker-compose version 1.15.0, build e12f3b9 [root@linux-node1 opt]# docker-compose version docker-compose version 1.15.0, build e12f3b9 docker-py version: 2.5.0 CPython version: 2.7.5 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013 [root@linux-node1 compose]# vim docker-compose.yml web1: image: nginx expose: - 80 web2: image: nginx expose: - 80 haproxy: image: haproxy volumes: - /opt/haproxy.cfg:/usr/local/haproxy/haproxy.cfg links: - web1 - web2 ports: - "7777:1080" - "80:80" docker-compose -d up 可以安装supervisor
1.12 docker安装nginx+uwsgi+python3.6
docker -it --name centos -p 8888:80 -p 2222:22 centos bash yum install -y epel-release yum install -y wget yum install gcc gcc-c++ -y