docker学习及应用
一、docker发展史
为什么要学习容器?
在openstack之后,目前互联网最火热的技术莫过于docker容器了,早在2015年,京东技术备战双11就是使用了10万+Docker,这两年docker更是如日中天。docker只是容器的一种,在学习docker之前,我有必要先了解一下什么是容器?有助于我们更好的了解docker。
什么是容器:
容器是在隔离的环境里面运行的一个进程,这个隔离的环境有自己的系统目录文件,有自己的ip地址,主机名等。
也有人称:容器是一种轻量级虚拟化的技术。
使用容器有什么好处?
容器相对于kvm虚拟机的优势:
1:容器能提供接近宿主机的性能,而kvm虚拟机会损害一部分宿主机的性能。
2:同样硬件配置的宿主机最多能启动10虚拟机,那么它可以启动100+容器。
3:启动一台kvm虚拟机,可以能需要20秒,启动一个容器只需要1秒。
4:kvm需要硬件cpu的支持,容器不需要。
linux开机启动流程:
bios开机硬件自检
根据bios设置的优先启动项
读取mbr引导
加载内核
启动第一个进程/sbin/init
执行系统初始化脚本/etc/rc.d/rc.sysinit完成系统初始化
运行想要的服务
sshd总结:kvm虚拟机运行一个sshd服务需要完整的开机启动流程,容器是直接启动sshd服务,中间的流程全部精简。
容器的发展史:
1)chroot技术chroot,即change root directory(更改 root 目录),在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的,而在使用chroot之后,系统的目录结构将以指定的位置作为/位置
2)lxc容器全称:linux container,通过namespaces 命名空间实现的隔离环境,通过cgroups实现的资源限制,提供类似虚拟机一样的体验。
3)docker容器早期的docker容器底层就是调用的lxc,后期才换成了自己的libcontainer
二、lxc容器的安装和使用
三、docker介绍和安装
(一)docker定义
Docker是通过内核虚拟化技术(namespaces及cgroups)来提供容器的资源隔离与资源限制。
由于Docker通过操作系统层的虚拟化实现隔离(对操作系统的内核有要求),所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,从而比kvm虚拟机更轻量。
docker是一种软件的打包技术。
(二)docker的理念
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行。
构建:制作docker镜像,打包容器的所有系统目录文件。
运输:下载docker镜像。
运行:基于docker镜像提供的rootfs,启动容器。
总结:只要能运行docker容器,那么docker镜像中已经安装好的软件也可以运行,所以说docker是一种软件的打包技术。
(三)docker的优点
1:解决了操作系统和软件运行环境的依赖nginx opensslgit openssl
2:对于开发人员来说,再也不用担心不会部署开发环境
3:开发环境,测试环境和生产环境高度一致。
4:让用户体验产品新特性的又一种思路。
(四)docker的安装
yum源配置: rm -fr /etc/yum.repos.d/local.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo 安装docker-ce: yum install docker-ce -y
(五)docker的架构
启动docker systemctl start docker systemctl enable docker docker version docker是一个cs架构: 通过docker version来查看 docker info docker最重要的三大组件: 镜像,容器,仓库
四、启动第一个docker容器
(一)启动第一个docker容器
docker容器是一种软件的打包技术,接下来我们体验一下传统编译安装nginx:官
网下载Nginx源码包wget
tar解压源码包
创建Nginx用户 安装依赖包
编译安装三部曲configure,make,make install
修改nginx配置文件
启动nginxdocker容器
docker run -d -p 80:80 nginx
[ ~]# docker run -d -p 80:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 8ec398bc0356: Pull complete dfb2a46f8c2c: Pull complete b65031b6a2a5: Pull complete Digest: sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce Status: Downloaded newer image for nginx:latest 2dcafeb781c891246564d3e23a8495b4fe8f32606240ff2acf062ae1dcd8351a [ ~]#
(二)docker命令解释
docker run -d -p 80:80 nginx
run (创建并运行一个容器)-
d 放在后台
-p 端口映射
nginx docker镜像的名字
(三)配置docker容器加速
配置docker镜像加速
[ ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com", "https://registry.docker-cn.com"
]
}
systemctl restart docker
五、docker镜像的常用命令
(一)搜索镜像:
docker search选镜像的建议:
1,优先考虑官方
2,starts数量多
(二)获取镜像
获取镜像: docker pull(push) 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com docker pull centos:6.8(没有指定版本,默认会下载最新版) docker pull daocloud.io/huangzhichong/alpine-cn:latest 扩展:查询docker镜像所有版本https://hub.docker.com/r/library/
(三)docker镜像其他操作
查看镜像 docker images docker images ls 删除镜像 docker rmi 例子:docker image rm centos:latest 导出镜像 docker save 例子:docker image save centos > docker-centos7.4.tar.gz 导入镜像 docker load 例子:docker image load -i docker-centos7.4.tar.gz
六、docker容器日常管理
(一)运行一个容器
docker run -d -p 80:80 nginx:latest run (创建并运行一个容器) -d 放在后台 -p 端口映射 nginx:latest docker镜像的名字和版本 还有很多其他的参数 docker run == docker create + docker start
(二)、docker常用其他命令
停止容器 docker stop CONTAINER_ID 杀死容器 docker kill container_name 查看容器列表 docker ps docker ps –a 删除容器 docker rm 批量删除容器 docker rm -f `docker ps -a -q`
(三)、docker的run扩展
docker run -it --name centos6 centos:6.8 /bin/bash -it 分配交互式的终端 --name 指定容器的名字 /bin/sh 覆盖容器的初始命令 --cpus 指定cpu的数量 --memory 限定内存的大小 -h 指定容器的主机名
(四)进入容器方法
进入容器的目的:排错,调试 进入容器的方法: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] 例子: docker exec -it 容器id或容器名字 /bin/bash docker attach [OPTIONS] CONTAINER 例子: docker attach 容器id或容器名字 nsenter(安装yum install -y util-linux 弃用)
(五)docker容器的核心理念
docker的本质是:在隔离的环境运行的一个进程 所以:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态! [ ~]# docker run -d -p 80:80 nginx [ ~]# docker ps -a [ ~]# docker container stop 35526c06959a [ ~]# docker ps -a [ ~]# docker run -d -p 80:80 nginx:latest [ ~]# docker container kill beautiful_greider [ ~]# docker run -d -p 80:80 nginx:latest [ ~]# docker container stop 1a75cb5461d9 [ ~]# docker container rm 1a75cb5461d9 [ ~]# docker container rm `docker ps -a -q` [ ~]# #所有退出状态的容器删除 [ ~]# docker container create nginx:latest [ ~]# docker start 441a6527829e [ ~]# docker run -it centos:6.8 /bin/bash [ ~]# docker run -it centos:6.8 [ /]# #两边界面相同 [ ~]# docker run -it centos:6.8 [ ~]# docker run -d centos:6.8 [ ~]# docker run -it centos:6.8 [ ~]# docker ps -a -l --no-trunc [ ~]# docker run -d nginx:latest [ ~]# docker run -d nginx:latest nginx -g 'daemon off' [ ~]# docker run -it nginx:latest /bin/bash [ ~]# docker pull alpine [ ~]# docker image [ ~]# docker run -it alpine:latest /bin/bash [ ~]# docker run -it alpine:latest /bin/sh [ ~]# docker run -d centos:6.8 tail -f /var/log/yum.log =============== [ ~]# docker container attach ef4337be4ae9 [ /]# #两边界面相同 [ ~]# docker exec -it 441a6527829e
七、docker容器网络访问
运行容器为什么要使用端口映射?
默认,情况下,容器使用的ip是172.17.0.0/16网段的,外界的用户只能访问宿主机的10.0.0.0/24网段,无法访问172.17.0.0/16网段。
我们运行容器的目的:是希望运行在容器中的服务,能够被外界访问,这里就涉及到了外网10.0.0.0/24到容器内网172.17.0.0/16网段的转换,所以需要做端口映射。
(一)docker运行容器端口映射的方法
指定映射(docker 自动添加一条iptables规则实现端口映射) -p hostPort:containerPort -p ip:hostPort:containerPort -p ip::containerPort(随机端口) -p hostPort:containerPort:udp -p 81:80 -p 443:443 可以指定多个-p 随机映射 docker run -P (随机端口)
实例:
80端口映射到80端口: [ ~]# docker run -d -p 80:80 nginx:latest 查看防火墙策略: [ ~]# iptables -t nat -L -n [ ~]# docker container inspect keen_austin [ ~]# curl -I 172.17.0.2 8080映射到80: [ ~]# docker run -d -p 8080:80 nginx:latest 配置第二个地址: [ ~]# ifconfig eth0:1 10.0.0.111/24 up 82端口映射到80: [ ~]# docker run -d -p 10.0.0.11:82:80 nginx:latest 10.0.0.111地址的82端口映射到80: [ ~]# docker run -d -p 10.0.0.111:82:80 nginx:latest 映射任意端口: [ ~]# docker run -d -p 10.0.0.111::80 nginx:latest [ ~]# netstat -lntp 查看内核参数配置: [ ~]# sysctl -a | grep ipv4 | grep range 产生任意端口: [ ~]# docker run -d -P nginx:latest [ ~]# docker ps [ ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 "/etc/sysctl.conf" 11L, 473C written [ ~]# [ ~]# sysctl -p net.ipv4.ip_forward = 1 [ ~]# #设置在内核参数中
八、docker数据卷存储
为什么要用docker数据卷:
数据卷的作用:
1:持久化容器运行过程中产生的数据文件
2:实现多个容器间的文件共享。
正常情况下,删除容器,容器中所有的文件也会被删除。
(一)常见的docker数据卷命令
创建一个数据卷 docker volume create
查看数据卷列表 docker volume ls
删除一个数据卷 docker volume rm
查看一个数据卷的属性 docker volume inspect
(二)docker数据卷应用一
docker volume create oldboy docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest cd /var/lib/docker/volumes/oldboy/_data/ rm -f * wget https://www.qstack.com.cn/xiaoniaofeifei.zip unzip xiaoniaofeifei.zip docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest docker run -d -p 82:80 -v oldboy:/usr/share/nginx/html nginx:latest
(三)把宿主机的目录挂载到容器中
cd /opt mkdir xiaoniao cd xiaoniao/ wget https://www.qstack.com.cn/xiaoniaofeifei.zip unzip xiaoniaofeifei.zip #重点 docker run -d -p 83:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
操作实例:
[ ~]# docker volume ls DRIVER VOLUME NAME [ ~]# docker volume create oldboy oldboy [ ~]# docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest 4c0b7d7c5035d88bff6c6aea00654b1f66989c6f9414f7373cf4c3ff9f5d24e0 [r ~]# docker ps -a -l [ ~]# docker volume ls DRIVER VOLUME NAME local oldboy [ ~]# docker volume inspect oldboy [ { "CreatedAt": "2020-01-13T22:58:30+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/oldboy/_data", "Name": "oldboy", "Options": {}, "Scope": "local" } ] [ ~]# cd /var/lib/docker/volumes/oldboy/_data/ [ _data]# ls 50x.html index.html [ _data]# rm * [ _data]# wget https://www.qstack.com.cn/xiaoniaofeifei.zip [ _data]# unzip xiaoniaofeifei.zip [ /]# docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest dddf5dbcdf6eddc181c2719f174825dcf9ab184cc3464f46a599a96c4c4807d4 [ /]# docker run -d -p 82:80 --volumes-from charming_jackson nginx:latest 90e64512a67e58c369866d38d3d8cf70fafe270f4ec35f914679da7db19894a5 [ /]# docker ps -a -q [ /]# docker rm -f `docker ps -a -q`
九、手动制作docker镜像
(一)制作docker镜像的步骤
制作docker镜像步骤:
1:启动容器安装软件服务
2:将安装好服务的容器commit提交为镜像
3: 启动新容器来测试新提交的镜像
(二)制作支持ssh远程登陆的docker镜像
制作docker镜像步骤: 1:启动容器安装软件服务 docker run -it -p 1022:22 --name oldboy centos:6.9 ###### yum install openssh-server /etc/init.d/sshd start passwd ###### 2:将安装好服务的容器commit提交为镜像 docker commit oldboy centos6-ssh:v1 3: 启动新容器来测试新提交的镜像 docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
(三)制作支持ssh+httpd双服务的镜像
1:启动容器安装软件服务 docker run -it --name oldgirl centos:6.9 yum install httpd yum install openssh-server /etc/init.d/sshd start passwd ###容器启动脚本 vi /init.sh #!/bin/bash /etc/init.d/httpd start /usr/sbin/sshd -D 2:将安装好服务的容器commit提交为镜像 docker commit oldgirl centos6-ssh-httpd:v1 3:启动新容器来测试新提交的镜像 docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh
(四)实例
[ /]# docker pull centos:6.9 [ /]# yum install openssh-server -y [ /]# docker run -it -p 1022:22 --name oldboy centos:6.9 [ /]# yum install openssd-server -y [ /]# /etc/init.d/sshd start [ /]# netstat -lntp [ /]# echo 123456 | passwd --stdin root [ ~]# ssh -p 1022 [ /]# docker commit oldboy centos6_ssh:v1 [ ~]# docker run -d -p 2022:22 centos6_ssh:v1 /usr/sbin/sshd -D 381f2b966a516286185e23e5f9514fe0a88c7c8791b3d5f37cbe168e51d349a9 [ /]# docker ps -a -l [ /]# ssh -p 2022 [ /]# docker run -it -p 1122:22 -p 8080:80 --name oldgirl centos:6.9 [ /]# yum install openssh-server -y [ /]# /etc/init.d/sshd start [ /]# yum install httpd -y [ /]# vi /init.sh #!/bin/bash /etc/init.d/httpd start /usr/sbin/sshd -D [ ~]# docker commit oldgirl centos6_ssh_http:v1 [ ~]# docker run -d -p 1222:22 -p 8090:80 centos6_ssh_http:v1 /bin/bash /init.sh [ ~]# curl -I 10.0.0.11:8090 [ ~]# ssh -p 1222
十、dockerfile自动构建镜像
相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:
1:dockerfile只有几kb,便于传输
2:使用dockerfile构建出来的镜像,在运行容器的时候,不用指定容器的初始命令
3:支持更多的自定义操作
(一)dockerfile常用指令
dockerfile常用指令: FROM 这个镜像的妈妈是谁?(指定基础镜像) MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有) RUN 你想让它干啥(在命令前面加上RUN即可) ADD 给它点创业资金(COPY文件,会自动解压) WORKDIR 我是cd,今天刚化了妆(设置当前工作目录) VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录) EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口) CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换) dockerfile其他指令: COPY 复制文件 ENV 环境变量 ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
(二)dockerfile实战(手工制作)
手动制作docker镜像步骤: 1:启动容器安装软件服务 docker run -it -p 1022:22 --name oldboy centos:6.9 ###### yum install openssh-server -y /etc/init.d/sshd start echo 123456|passwd --stdin root ###### 2:将安装好服务的容器commit提交为镜像 docker commit oldboy12 centos6-ssh:v1 3: 启动新容器来测试新提交的镜像 docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D 手工制作: [ ~]# docker run -it -p 1022:22 --name oldboy12 centos:6.9 [ /]# yum install openssh-server -y [ /]# /etc/init.d/sshd start [ /]# echo 123456|passwd --stdin root [ /]# exit exit [ ~]# docker commit oldboy12 centos6-ssh:v1 [ ~]# docker ps -l [ ~]# docker run -d -p 2023:22 centos6-ssh:v1 /usr/sbin/sshd -D [ ~]# ssh -p 2023
(三)dockerfile实战
[ kop]# cat dockerfile FROM centos:6.9 RUN yum install httpd php php-cli php-gd php-mbstring unzip -y WORKDIR /var/www/html COPY kodexplorer4.37.zip . RUN unzip kodexplorer4.37.zip RUN chmod -R 777 /var/www/html/ ADD init.sh /init.sh EXPOSE 80 22 CMD ["/bin/bash","/init.sh"] [ kop]# cat init.sh #!/bin/bash /etc/init.d/httpd start tail -F /var/log/httpd/access_log [ kop]#
十一、docker私有仓库registry
(一)运行docker私有仓库
运行docker私有仓库:docker run -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry当容器启动完成,私有仓库就可以使用了
(二)上传镜像到私有仓库
上传到私有仓库的步骤:
a:给要上传的镜像打tag10.0.0.12:5000/httpd:latest (手动给它打tag)
b:上传docker push 10.0.0.12:5000/httpd:latest
报错解决方法:vi /etc/docker/daemon.json{ "registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12:5000"]}
systemctl restart docker
(三)带base认证的私有仓库
a:base认证密码文件准备 yum install httpd-tools -y mkdir /opt/registry-var/auth/ -p htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd b:启动docker私有仓库 docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry ---------------------- a:base认证密码文件准备 yum install httpd-tools -y mkdir /opt/registry-var/auth/ -p htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd b:启动docker私有仓库 docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
(四)实战
① [ ~]# docker run -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry Unable to find image 'registry:latest' locally latest: Pulling from library/registry c87736221ed0: Pull complete 1cc8e0bb44df: Pull complete 54d33bcb37f5: Pull complete e8afc091c171: Pull complete b4541f6d3db6: Pull complete Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146 Status: Downloaded newer image for registry:latest 65fecd20716b2d75419fe47e29068ccf0eb2205919baae9fe70d27894638019b [ ~]# ② [ ~]# docker pull daocloud.io/huangzhichong/alpine-cn:latest latest: Pulling from huangzhichong/alpine-cn 0a8490d0dfd3: Pull complete 8881e0c6b9b8: Pull complete Digest: sha256:57c79fbd51aac09ea307ba6ddbbb4cc60f49e015d261193bacff95f9fa39d88c Status: Downloaded newer image for daocloud.io/huangzhichong/alpine-cn:latest daocloud.io/huangzhichong/alpine-cn:latest [ ~]# cd /opt/myregistry/docker/registry/v2/ [ v2]# ll total 0 drwxr-xr-x 3 root root 20 Jan 17 20:27 blobs drwxr-xr-x 3 root root 19 Jan 17 20:27 repositories [ v2]# cd repositories/ [ repositories]# ll total 0 drwxr-xr-x 5 root root 55 Jan 17 20:28 httpd [ repositories]# [ repositories]# ll total 0 drwxr-xr-x 5 root root 55 Jan 17 20:31 centos drwxr-xr-x 5 root root 55 Jan 17 20:28 httpd [ repositories]# tree httpd/_manifests/tags/ ③ [ repositories]# yum install httpd-tools -y [ repositories]# mkdir /opt/registry-var/auth/ -p [ repositories]# htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd [ repositories]# [ repositories]# [ repositories]# docker ps [ repositories]# docker kill 65fecd20716b 65fecd20716b [ repositories]# docker rm 65fecd20716b [ repositories]# docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry b567add48840af43273382cd5d5459c0b321d696b71c8875e4e360b023fa7297 [ repositories]# docker ps ④ [ kop]# docker images [ kop]# docker image tag httpd:latest 10.0.0.12:5000/httpd:latest [ kop]# docker images [ kop]# docker push 10.0.0.12:5000/httpd:latest The push refers to repository [10.0.0.12:5000/httpd] Get https://10.0.0.12:5000/v2/: http: server gave HTTP response to HTTPS client [ kop]# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com", "https://registry.docker-cn.com" ], "insecure-registries": ["10.0.0.12:5000"] } [ kop]# systemctl restart docker [ kop]# docker push 10.0.0.12:5000/httpd:latest The push refers to repository [10.0.0.12:5000/httpd] ⑤ [ opt]# docker tag centos:6.8 10.0.0.12:5000/centos:6.8 [ opt]# docker push 10.0.0.12:5000/centos:6.8 [ opt]# docker rmi centos:6.8 10.0.0.12:5000/centos:6.8 Untagged: centos:6.8 Untagged: :39abd0c8e375de6fb7334d42ec2a46643f34cbc1bbaf37e2b484065f05eaa7a2 Error response from daemon: conflict: unable to remove repository reference "10.0.0.12:5000/centos:6.8" (must force) - container 33d9dfd21a81 is using its referenced image 82f3b5f3c58f [ opt]# docker rm 33d9dfd21a81 33d9dfd21a81 [ opt]# docker rmi centos:6.8 10.0.0.12:5000/centos:6.8 [ opt]# docker login 10.0.0.12:5000 Login Succeeded [ opt]# cat /root/.docker/config.js [ opt]#docker pull 10.0.0.12:5000/centos:6.8 [ opt]# docker images
十二、容器编排docker-compose
(一)docker-compose安装
[ opt]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 510 0 --:--:-- 0:00:01 --:--:-- 511 0 15.4M 100 15.4M 0 0 191k 0 0:01:22 0:01:22 --:--:-- 201k ▽ opt]# chmod +x /usr/local/bin/docker-compose [ opt]# docker-compose -v docker-compose version 1.24.1, build 4667896b [ mywordpress]# vim docker-compose.yml vi docker-compose.yml version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - web_data:/var/www/html ports: - "80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data: web_data: ================== [ mywordpress]# docker-compose up [ mywordpress]# docker-compose up -d [ mywordpress]# docker-compose scale wordpress=3 [ mywordpress]# docker ps
nginx安装
[ repositories]# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm [ repositories]# sudo yum install -y nginx 配置文件: [ nginx]# cat nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream wordpress { server 10.0.0.11:32769; server 10.0.0.11:32770; server 10.0.0.11:32771; } server { listen 80; server_name localhost; location / { proxy_pass http://wordpress; proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } [ nginx]# [ nginx]# systemctl start nginx
在目录下配置测试文件:
[ _data]# pwd /var/lib/docker/volumes/mywordpress_web_data/_data [ _data]# cat info.php <?php phpinfo(); ?> [ _data]# 不停刷新页面发现地址代理地址不同: http://10.0.0.12/info.php
十三、容器的四种网络类型
None:不为容器配置任何网络功能,--net=none Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID Host:与主机共享Network Namespace,--net=host Bridge:Docker设计的NAT网络模型(默认) [ _data]# docker run -it --network none busybox:latest 检查网络类型: docker ps -a -l docker inspect competent_lewin ---- [ _data]# docker run -d httpd:latest dbf395b9b91dbc83fdf16535d686a2e3172520022fe9142edbef0461ea11f53c [ _data]# docker run -it --network container:charming_antonelli 10.0.0.12:5000/centos:6.8 ([ ~]# docker ps -a -l 查出name) [ /]# netstat -lntp [ ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f09de4357455 10.0.0.12:5000/centos:6.8 "/bin/bash" About a minute ago Up About a minute charming_feynman [ ~]# docker inspect f09de4357455 network为空。 host: [ _data]# docker run -it --network host 10.0.0.12:5000/centos:6.8 [ /]# ifconfig 跟宿主机共用。
十四、跨主机通信之macvlan
macvlan定义:
macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。
macvlan 本质上是一种网卡虚拟化技术
使用macvlan实现容器跨主机通信:
创建macvlan:(两台主机都需要) docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1 测试: docker01: docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh docker02: docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh [ _data]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1 41476f94745165b43591760a9fe4541d0bf13d1c3498f84bd4daa8aa14fafe0f [ _data]# docker network ls NETWORK ID NAME DRIVER SCOPE e3f7c473d255 bridge bridge local ed8ed81588ce host host local 41476f947451 macvlan_1 macvlan local e8e53247c464 mywordpress_default bridge local e6e9a262ab5f none null local [ _data]# docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh [ nginx]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1 2644c26dbacfe64add4eba8a792fcaee04384d08255918590367569fe5058cd9 [ nginx]# [ nginx]# docker network ls NETWORK ID NAME DRIVER SCOPE e60a56edfd03 bridge bridge local 85abdf640cbc host host local 2644c26dbacf macvlan_1 macvlan local daa49e0aaede none null local [ nginx]# docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh 开启混杂模式: [ _data]# ip link set eth0 promisc on [ _data]# ip link show eth0
十五、跨主机容器间通信之overlay
1)准备工作 docker03上: docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap docker01、02上: vim /etc/docker/daemon.json { "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"], "cluster-store": "consul://10.0.0.13:8500", "cluster-advertise": "10.0.0.11:2376", "insecure-registries": ["10.0.0.11:5000"] } 2)创建overlay网络 docker network create -d overlay ol1 3)启动容器测试 docker run -it --network ol1 --name oldboy02 busybox:latest /bin/sh
十六、企业级私有仓库harbor
harbor-offline-installer-v1.5.1.tgz 链接:https://pan.baidu.com/s/1Z9I7zYXSt-8ve3lFT2YCeg 提取码:iuqj 第一步:安装docker和docker-compose 第二步:下载harbor-offline-installer-v1.5.1.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.cfg配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456 第五步:执行install.sh ### ./install.sh 推送镜像: [ _data]# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com", "https://registry.docker-cn.com" ], "insecure-registries": ["10.0.0.12:5000"], "insecure-registries": ["10.0.0.11"] [ _data]# systemctl restart docker docker login 10.0.0.11 [ kop]# docker images [ kop]# docker image tag busybox:latest 10.0.0.11/library/busybox:latest [ kop]# docker images [ kop]# docker push busybox:latest 10.0.0.11/library/busybox:latest 登录web页面检查,是否推送成功。 下来镜像: [ _data]# vim /etc/docker/daemon.json "insecure-registries": ["10.0.0.11"] [ _data]# systemctl restart docker 直接复制web页面,让后在需要主机上黏贴。