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服务,中间的流程全部精简。(docker共用宿主机内核。)

容器的发展史:

1)chroot技术chroot,即change root directory(更改 root 目录),在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的,而在使用chroot之后,系统的目录结构将以指定的位置作为/位置。

2)lxc容器全称:linux container,通过namespaces 命名空间实现的隔离环境,通过cgroups实现的资源限制,提供类似虚拟机一样的体验。

3)docker容器早期的docker容器底层就是调用的lxc,后期才换成了自己的libcontainer。

二、lxc容器的安装和使用

lxc容器的安装

  1. lxc容器的依赖:
  2. 依赖CentOS-Base.repoepel.repo
  3. rm -fr /etc/yum.repos.d/local.repo
  4. curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  5. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  6. 安装lxc容器:(Ubuntu上开发的,在Ubuntu上可以直接使用,centos可以直接使用)
  7. yum install lxc-* -y
  8. yum install libcgroup* -y
  9. yum install bridge-utils.x86_64 -y

为lxc容器准备桥接网卡(virsh iface-bridge eth0 br0)

  1. echo 'TYPE=Ethernet
  2. BOOTPROTO=none
  3. NAME=eth0
  4. DEVICE=eth0
  5. ONBOOT=yes
  6. BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
  7. echo 'TYPE=Bridge
  8. BOOTPROTO=static
  9. NAME=virbr0
  10. DEVICE=virbr0
  11. ONBOOT=yes
  12. IPADDR=10.0.0.14
  13. NETMASK=255.255.255.0
  14. GATEWAY=10.0.0.254
  15. DNS1=223.5.5.5' >/etc/sysconfig/network-scripts/ifcfg-virbr0

创建并启动容器

  1. 创建lxc容器:
  2. lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images
  3. 注意:
  4. Distribution: centos
  5. Release: 6
  6. Architecture: amd64
  7. 设置容器的root用户密码
  8. chroot /var/lib/lxc/centos6/rootfs passwd
  9. 启动容器:
  10. lxc-start -n centos6

lxc容器的进程:容器中运行的命令,在宿主机中都可以看到推荐使用pstree命令来查看,需安装yum install psmisc.x86_64 -y,lxc容器的系统目录文件:lxc容器的系统目录文件在宿主机的某一个目录下/var/lib/lxc/容器名/rootfs

三、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 openssl

​ git openssl(nginx,git 适应不同的openssl的版本,兼容性存在问题)

2:对于开发人员来说,再也不用担心不会部署开发环境。

3:开发环境,测试环境和生产环境高度一致。

4:让用户体验产品新特性的又一种思路。

docker的安装:

  1. yum源配置:
  2. rm -fr /etc/yum.repos.d/local.repo
  3. curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  4. curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  5. sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
  6. ----
  7. 上面不可用时候替换备选(阿里源):
  8. https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  9. ---
  10. 安装docker-ce
  11. yum install docker-ce -y

docker的架构

  1. 启动docker
  2. systemctl start docker
  3. systemctl enable docker
  4. docker是一个cs架构:
  5. 通过docker version来查看
  6. docker最重要的三大组件:
  7. 镜像,容器,仓库

四、启动第一个docker容器

  1. docker容器是一种软件的打包技术,接下来我们体验一下
  2. 传统编译安装nginx
  3. 官网下载Nginx源码包wget
  4. tar解压源码包
  5. 创建Nginx用户
  6. 安装依赖包
  7. 编译安装三部曲configuremakemake install
  8. 修改nginx配置文件
  9. 启动nginx
  10. docker容器
  11. docker run -d -p 80:80 nginx
  12. 命令解释:
  13. run (创建并运行一个容器)
  14. -d 放在后台
  15. -p 端口映射
  16. nginx docker镜像的名字
  17. 为了快速下载镜像:
  18. 配置docker镜像加速
  19. vi /etc/docker/daemon.json
  20. {
  21. "registry-mirrors": ["https://registry.docker-cn.com"]
  22. }
  23. systemctl restart docker

五、docker镜像的常用命令

搜索镜像: docker search

选镜像的建议:

1,优先考虑官方

2,starts数量多

镜像获取:

  1. 获取镜像:
  2. docker pullpush
  3. 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com
  4. docker pull centos:6.8(没有指定版本,默认会下载最新版)
  5. docker pull daocloud.io/huangzhichong/alpine-cn:latest
  6. 扩展:查询docker镜像所有版本https://hub.docker.com/r/library/

docker其他操作:

  1. 查看镜像
  2. docker images
  3. 删除镜像
  4. docker rmi 例子:docker image rm centos:latest
  5. 导出镜像
  6. docker save 例子:docker image save centos > docker-centos7.4.tar.gz
  7. 导入镜像
  8. docker load 例子:docker image load -i docker-centos7.4.tar.gz
  9. [root@docker-01 docker]# docker image
  10. build history import inspect load ls prune pull push rm save tag
  11. build:构建镜像
  12. history:查看构建镜像的历史
  13. import:导入镜像(弃用)
  14. inspect:查看镜像的详细信息
  15. load:导入镜像
  16. ls:查看镜像
  17. prune:删除(已经不用)
  18. pull:下载镜像
  19. push:上传镜像
  20. rm:删除镜像
  21. save:导出镜像
  22. tag:镜像起别名

六、docker容器日常管理

运行一个容器:

  1. docker run -d -p 80:80 nginx:latest
  2. run (创建并运行一个容器)
  3. -d 放在后台
  4. -p 端口映射
  5. nginx:latest docker镜像的名字和版本
  6. 还有很多其他的参数
  7. docker run == docker create + docker start

docker 其他命令

  1. 停止容器
  2. docker stop CONTAINER_ID
  3. 杀死容器
  4. docker kill container_name
  5. 查看容器列表
  6. docker ps
  7. docker ps a
  8. 删除容器
  9. docker rm
  10. 批量删除容器
  11. docker rm -f `docker ps -a -q`
  12. [root@docker-01 docker]# docker container
  13. attach cp diff export kill ls port rename rm start stop unpause wait
  14. commit create exec inspect logs pause prune restart run stats top update

docker的run的扩展

  1. docker run -it --name centos6 centos:6.8 /bin/bash
  2. -it 分配交互式的终端
  3. --name 指定容器的名字
  4. /bin/sh 覆盖容器的初始命令
  5. --cpus 指定cpu的数量
  6. --memory 限定内存的大小
  7. -h 指定容器的主机名

进入容器的方法

  1. 进入容器的目的:排错,调试
  2. 进入容器的方法:
  3. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  4. 例子: (使用不同的终端vty
  5. docker exec -it 容器id或容器名字 /bin/bash
  6. docker attach [OPTIONS] CONTAINER
  7. 例子:(使用相同的终端vty
  8. docker attach 容器id或容器名字
  9. nsenter(安装yum install -y util-linux 弃用)

容器的核心理念

  1. docker的本质是:在隔离的环境运行的一个进程
  2. 所以:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
  3. tail -f(-F

七、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运行容器端口映射的方法

  1. 指定映射(docker 自动添加一条iptables规则实现端口映射)
  2. -p hostPort:containerPort
  3. -p ip:hostPort:containerPort
  4. -p ip::containerPort(随机端口)
  5. -p hostPort:containerPort:udp
  6. -p 81:80 -p 443:443 可以指定多个-p
  7. 随机映射
  8. docker run -P (随机端口)

docker自动添加iptables的规则

iptables -t nat -L -n

docker 容器的网络原理图

  1. yum install bridge-utils.x86_64 -y
  2. brctl show (查看容器网桥)
  3. [root@docker-01 ~]# tail -1 /etc/sysctl.conf
  4. net.ipv4.ip_forward = 1
  5. [root@docker-01 ~]# sysctl -p
  6. net.ipv4.ip_forward = 1
  7. [root@docker-01 ~]#
  8. 默认情况下,net.ipv4.ip_forward=0;开启容器后自动改为1,但是挂起容器宿主机挂起后又开启的时候会自动设置为0,导致容器无法访问。为防止这情况发生,将此配置放在内核配置文件中。

八、docker数据卷存储

为什么要要使用docker数据卷

数据卷的作用:

1:持久化容器运行过程中产生的数据文件

2:实现多个容器间的文件共享。

正常情况下,删除容器,容器中所有的文件也会被删除。使用数据卷后,删除容器后数据在数据卷中不会被删除。

常见的docker数据卷命令

  1. 创建一个数据卷
  2. docker volume create
  3. 查看数据卷列表
  4. docker volume ls
  5. 删除一个数据卷
  6. docker volume rm
  7. 查看一个数据卷的属性
  8. docker volume inspect

数据卷应用:

  1. docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest
  2. 根据命令查看容器位置:[root@docker-01 ~]# docker volume inspect oldboy
  3. cd /var/lib/docker/volumes/oldboy/_data/
  4. rm -f *
  5. wget https://www.qstack.com.cn/xiaoniaofeifei.zip
  6. unzip xiaoniaofeifei.zip
  7. docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest
  8. docker run -d -p 82:80 -v oldboy:/usr/share/nginx/html nginx:latest

将宿主机的目录挂载到容器中

  1. cd /opt
  2. mkdir xiaoniao
  3. cd xiaoniao/
  4. wget https://www.qstack.com.cn/xiaoniaofeifei.zip
  5. unzip xiaoniaofeifei.zip
  6. #重点
  7. docker run -d -p 83:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest

九、手动制作docker镜像

制作docker镜像步骤:

  • 1:启动容器安装软件服务
  • 2:将安装好服务的容器commit提交为镜像
  • 3: 启动新容器来测试新提交的镜像

制作支持ssh远程登陆的docker镜像

  1. 制作docker镜像步骤:
  2. 1:启动容器安装软件服务
  3. docker run -it -p 1023:22 --name oldboy centos:6.9
  4. ######
  5. yum install openssh-server
  6. /etc/init.d/sshd start
  7. passwd
  8. 或者
  9. echo 123456|passwd --stdin root
  10. ######
  11. 2:将安装好服务的容器commit提交为镜像
  12. docker commit oldboy centos6-ssh:v1
  13. 3: 启动新容器来测试新提交的镜像
  14. docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
  15. /usr/sbin/sshd -D:这个命令可以启动ssh的同时将容器夯住。

制作支持ssh+httpd双服务的镜像

  1. 1:启动容器安装软件服务
  2. docker run -it --name oldgirl centos:6.9
  3. yum install httpd
  4. yum install openssh-server
  5. /etc/init.d/sshd start
  6. passwd
  7. ###容器启动脚本
  8. vi /init.sh
  9. #!/bin/bash
  10. /etc/init.d/httpd start
  11. /usr/sbin/sshd -D
  12. ---
  13. 或者使用以下这个脚本
  14. [root@dbb708722b6c /]# cat /init.sh
  15. #!/bin/bash
  16. /etc/init.d/sshd start
  17. /etc/init.d/httpd start
  18. tail -F /var/log/httpd/access-log(可以夯住容器进程)
  19. 2:将安装好服务的容器commit提交为镜像
  20. docker commit oldgirl centos6-ssh-httpd:v1
  21. 3:启动新容器来测试新提交的镜像
  22. docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh

十、dockerfile自动构建镜像

手动docker镜像的缺点

相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:

  • 1:dockerfile只有几kb,便于传输
  • 2:使用dockerfile构建出来的镜像,在运行容器的时候,不用指定容器的初始命令
  • 3:支持更多的自定义操作

dockerfile常用指令:

​ FROM 这个镜像的妈妈是谁?(指定基础镜像)

​ MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)

​ RUN 你想让它干啥(在命令前面加上RUN即可)

​ ADD 给它点创业资金(COPY文件,会自动解压)

​ WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)

​ VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)

​ EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)

​ CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)

dockerfile其他指令:

​ COPY 复制文件

​ ENV 环境变量

​ ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)

dockerfile实战1:

  1. 手动制作docker镜像步骤:
  2. 1:启动容器安装软件服务
  3. docker run -it -p 1022:22 --name oldboy centos:6.9
  4. ######
  5. yum install openssh-server -y
  6. /etc/init.d/sshd start
  7. echo 123456|passwd --stdin root
  8. ######
  9. 2:将安装好服务的容器commit提交为镜像
  10. docker commit oldboy centos6-ssh:v1
  11. 3: 启动新容器来测试新提交的镜像
  12. docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
  13. ==============================
  14. dockerfile制作docker镜像步骤:
  15. 1:编写dockerfile
  16. vi dockerfile
  17. FROM centos:6.9
  18. RUN yum install openssh-server -y
  19. RUN /etc/init.d/sshd start
  20. RUN echo 123456|passwd --stdin root
  21. CMD ["/usr/sbin/sshd","-D"]
  22. 2docker build构建镜像
  23. docker build -t centos6-ssh:v2 .
  24. 3: 启动新容器来测试新构建的镜像
  25. docker run -d -p 1422:22 centos6-ssh:v2

dockerfile实战2

  1. 手动制作支持ssh-http双服务的docker镜像
  2. 1:启动容器安装软件服务
  3. docker run -it --name oldgirl centos:6.9
  4. yum install httpd -y
  5. yum install openssh-server -y
  6. /etc/init.d/sshd start
  7. echo 123456|passwd --stdin root
  8. ###容器启动脚本
  9. vi /init.sh
  10. #!/bin/bash
  11. /etc/init.d/httpd start
  12. /usr/sbin/sshd -D
  13. 2:将安装好服务的容器commit提交为镜像
  14. docker commit oldgirl centos6-ssh-httpd:v1
  15. 3:启动新容器来测试新提交的镜像
  16. docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh
  17. ============================================
  18. dockerfile制作docker镜像步骤:
  19. 1:编写dockerfile
  20. FROM centos:6.9
  21. RUN yum install openssh-server httpd -y
  22. RUN /etc/init.d/sshd start
  23. RUN echo 123456|passwd --stdin root
  24. ADD init.sh /init.sh (将宿主机当前目录下的init.sh文件拷贝只容器的根目录下)
  25. CMD [“/bin/bash",“/init.sh"]
  26. ###容器启动脚本
  27. vi /init.sh
  28. #!/bin/bash
  29. /etc/init.d/httpd start
  30. /usr/sbin/sshd -D
  31. 2docker build构建镜像
  32. docker build -t centos6-ssh-httpd:v2 .
  33. 3:启动新容器来测试新提交的镜像
  34. docker run -d -p 8080:80 -p 2122:22 centos6-ssh-httpd:v2

docker 实战3

  1. [root@docker-01 centos6_ssh_http]# cat dockerfile
  2. FROM centos:6.9
  3. RUN yum install openssh-server httpd -y
  4. RUN /etc/init.d/sshd start
  5. RUN echo 123456|passwd --stdin root
  6. ADD init.sh /init.sh
  7. EXPOSE 80 22
  8. CMD ["/bin/bash","/init.sh"]
  9. [root@docker-01 centos6_ssh_http]# cat init.sh
  10. #!/bin/bash
  11. /etc/init.d/httpd start
  12. /usr/sbin/sshd -D
  13. [root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v3 .
  14. [root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v3
  15. [root@docker-01 centos6_ssh_http]# docker ps -a -l
  16. [root@docker-01 centos6_ssh_http]# docker exec -it objective_pike /bin/bash

docker实战4

  1. [root@docker-01 centos6_ssh_http]# cat dockerfile
  2. FROM centos:6.9
  3. RUN yum install openssh-server httpd -y
  4. RUN /etc/init.d/sshd start
  5. RUN echo 123456|passwd --stdin root
  6. ADD init.sh /init.sh
  7. EXPOSE 80 22
  8. WORKDIR /root
  9. CMD ["/bin/bash","/init.sh"]
  10. [root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v5 .
  11. [root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v5
  12. [root@docker-01 centos6_ssh_http]# docker ps -a -l
  13. [root@docker-01 centos6_ssh_http]# docker exec -it pensive_tesla /bin/bash
  14. [root@23b7958b721e ~]# pwd
  15. /root

docker 容器实战5

  1. [root@docker-01 centos6_ssh_http]# cat dockerfile
  2. FROM centos:6.9
  3. RUN yum install openssh-server httpd -y
  4. RUN /etc/init.d/sshd start
  5. RUN echo 123456|passwd --stdin root
  6. ADD init.sh /init.sh
  7. EXPOSE 80 22
  8. WORKDIR /root
  9. ENV SSH_PASSWD=123456
  10. CMD ["/bin/bash","/init.sh"]
  11. [root@docker-01 centos6_ssh_http]# cat init.sh
  12. #!/bin/bash
  13. echo $SSH_PASSWD|passwd --stdin root
  14. /etc/init.d/httpd start
  15. /usr/sbin/sshd -D
  16. [root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v6 .
  17. [root@docker-01 centos6_ssh_http]# docker run --env "SSH_PASSWD=oldboy123" -d -P centos6-ssh-httpd:v6
  18. [root@docker-01 centos6_ssh_http]# docker ps -a -l
  19. [root@docker-01 centos6_ssh_http]# ssh root@10.0.0.11 -p 32779

docker 容器实战6

  1. [root@docker-01 centos6_ssh_http]# cat dockerfile
  2. FROM centos:6.9
  3. RUN yum install openssh-server httpd -y
  4. RUN /etc/init.d/sshd start
  5. RUN echo 123456|passwd --stdin root
  6. ADD init.sh /init.sh
  7. EXPOSE 80 22
  8. WORKDIR /root
  9. ENV SSH_PASSWD=123456
  10. ENTRYPOINT ["/bin/bash","/init.sh"]
  11. [root@docker-01 centos6_ssh_http]# cat init.sh
  12. #!/bin/bash
  13. echo $SSH_PASSWD|passwd --stdin root
  14. /etc/init.d/httpd start
  15. /usr/sbin/sshd -D
  16. [root@docker-01 centos6_ssh_http]#
  17. [root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v7 .
  18. [root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v7 sleep 10
  19. [root@docker-01 centos6_ssh_http]# docker ps -a -l
  20. #这里的sleep 10没有起作用,作用的是的entrypoint 后的执行脚本。

十一、dockerfile构建php项目

把项目封装成docker镜像的步骤

  1. 把项目封装成docker镜像的步骤:
  2. 1:先运行一个基础容器,手动制作docker镜像
  3. 2:编写dockerfile,构建镜像
  4. 3:测试运行
  5. =============
  6. dockerfile常用指令:
  7. FROM 这个镜像的妈妈是谁?(指定基础镜像)
  8. MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
  9. RUN 你想让它干啥(在命令前面加上RUN即可)
  10. ADD 给它点创业资金(COPY文件,会自动解压)
  11. WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
  12. VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
  13. EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
  14. CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
  15. dockerfile其他指令:
  16. COPY 复制文件
  17. ENV 环境变量
  18. ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)

手工启动容器:

  1. [root@docker-01 centos6_ssh_http]# docker rm -f `docker ps -a -q`
  2. [root@docker-01 centos6_ssh_http]# docker run -it -p 80:80 centos:6.9
  3. yum install httpd php php-cli unzip php-gd php-mbstring -y
  4. /etc/init.d/httpd start
  5. cd /var/www/html/
  6. curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
  7. unzip kodexplorer4.40.zip
  8. chmod -R 777 /var/www/html/

docker项目制作dockerfile文件:

  1. curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
  2. [root@docker-01 kop]# ll
  3. total 13580
  4. -rw-r--r-- 1 root root 259 Apr 12 18:27 dockerfile
  5. -rw-r--r-- 1 root root 69 Apr 12 18:29 init.sh
  6. -rw-r--r-- 1 root root 13894810 Apr 12 18:28 kodexplorer4.40.zip
  7. [root@docker-01 kop]# cat dockerfile
  8. FROM centos:6.9
  9. RUN yum install httpd php php-cli unzip php-gd php-mbstring -y
  10. WORKDIR /var/www/html
  11. COPY kodexplorer4.40.zip .
  12. RUN unzip kodexplorer4.40.zip
  13. RUN chmod -R 777 /var/www/html/
  14. ADD init.sh /init.sh
  15. EXPOSE 80 22
  16. CMD ["/bin/bash","/init.sh"]
  17. [root@docker-01 kop]# cat init.sh
  18. #!/bin/bash
  19. /etc/init.d/httpd start
  20. tail -F /var/log/http/access_log
  21. [root@docker-01 kop]# docker build -t kod:v1 .
  22. [root@docker-01 kop]# docker run -d -P kod:v1
  23. [root@docker-01 kop]# docker ps -a -l

十二、dockerfile镜像的分层

docker镜像的分层

有变化的数据变化的都会被封装成一层。

镜像分层的好处

分层的好处:

共享资源,节省资源。

有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。

dockerfile中run的原理:

运行临时的容器。运行过程中可以另开窗口,docker ps -a -l 查看,docker ps -a -l --no--trunc 查看信息信息。

docker 容器的总结

十三、容器间的互联和应用

docker容器间的互联

  1. 容器间互联的方法:--link 单方向的
  2. docker run -d --name oldboy httpd:latest
  3. docker run -it --link oldboy:web01 centos:6.8
  4. 测试:
  5. curl oldboy
  6. curl web01
  7. 原理:
  8. cat /etc/hosts
  9. ========
  10. [root@docker-01 kop]# docker run -d --name oldboy httpd:latest
  11. [root@docker-01 kop]# docker run -it --link oldboy:web01 centos:6.9
  12. [root@docker-01 ~]# docker inspect oldboy
  13. [root@006f2289cc04 /]# curl -I 172.17.0.3
  14. [root@006f2289cc04 /]# curl -I oldboy
  15. [root@006f2289cc04 /]# cat /etc/hosts
  16. 172.17.0.3 web01 5f2c3eab08d8 oldboy
  17. 172.17.0.4 006f2289cc04
  18. [root@006f2289cc04 /]#

容器间互联的应用(zabbix安装实例)

  1. docker run --name mysql-server -t \
  2. -e MYSQL_DATABASE="zabbix" \
  3. -e MYSQL_USER="zabbix" \
  4. -e MYSQL_PASSWORD="zabbix_pwd" \
  5. -e MYSQL_ROOT_PASSWORD="root_pwd" \
  6. -d mysql:5.7 \
  7. --character-set-server=utf8 --collation-server=utf8_bin
  8. docker run --name zabbix-java-gateway -t \
  9. -d zabbix/zabbix-java-gateway:latest
  10. docker run --name zabbix-server-mysql -t \
  11. -e DB_SERVER_HOST="mysql-server" \
  12. -e MYSQL_DATABASE="zabbix" \
  13. -e MYSQL_USER="zabbix" \
  14. -e MYSQL_PASSWORD="zabbix_pwd" \
  15. -e MYSQL_ROOT_PASSWORD="root_pwd" \
  16. -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
  17. --link mysql-server:mysql \
  18. --link zabbix-java-gateway:zabbix-java-gateway \
  19. -p 10051:10051 \
  20. -d zabbix/zabbix-server-mysql:latest
  21. docker run --name zabbix-web-nginx-mysql -t \
  22. -e DB_SERVER_HOST="mysql-server" \
  23. -e MYSQL_DATABASE="zabbix" \
  24. -e MYSQL_USER="zabbix" \
  25. -e MYSQL_PASSWORD="zabbix_pwd" \
  26. -e MYSQL_ROOT_PASSWORD="root_pwd" \
  27. --link mysql-server:mysql \
  28. --link zabbix-server-mysql:zabbix-server \
  29. -p 80:80 \
  30. -d zabbix/zabbix-web-nginx-mysql:latest

配置监控的docker02主机:

  1. [root@docker-02 ~]# rpm -qa | grep docker
  2. docker-ce-19.03.5-3.el7.x86_64
  3. docker-ce-cli-19.03.5-3.el7.x86_64
  4. [root@docker-02 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.5/rhel/7/x86_64/zabbix-agent-5.0.0-0.4alpha4.el7.x86_64.rpm
  5. [root@docker-02 ~]# vim /etc/zabbix/zabbix_agentd.conf
  6. 修改:server=10.0.0.11
  7. [root@docker-02 ~]# systemctl restart zabbix-agent.service
  8. 打开网页监控docker02

十四、docker私有仓库registry

运行docker私有仓库

  1. 运行docker私有仓库:
  2. docker run -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry
  3. 当容器启动完成,私有仓库就可以使用了

上传镜像到私有仓库

  1. 上传到私有仓库的步骤:
  2. a:给要上传的镜像打tag
  3. 10.0.0.12:5000/httpd:latest (手动给它打tag)
  4. b:上传
  5. docker push 10.0.0.12:5000/httpd:latest
  6. 报错解决方法:
  7. vi /etc/docker/daemon.json
  8. {
  9. "registry-mirrors": ["https://registry.docker-cn.com"],
  10. "insecure-registries": ["10.0.0.12:5000"]
  11. }
  12. systemctl restart docker

带base认证的私有仓库

  1. a:base认证密码文件准备
  2. yum install httpd-tools -y
  3. mkdir /opt/registry-var/auth/ -p
  4. htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
  5. b:启动docker私有仓库
  6. 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-compose

安装docker-compose

  1. 安装:
  2. curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  3. yum install -y python2-pip
  4. pip install docker-compose
  5. 或者pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
  6. 检查是否安装成功
  7. docker-compose -v
  8. ===============================
  9. [root@docker-01 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
  10. % Total % Received % Xferd Average Speed Time Time Time Current
  11. Dload Upload Total Spent Left Speed
  12. 100 617 0 617 0 0 510 0 --:--:-- 0:00:01 --:--:-- 511
  13. 0 15.4M 100 15.4M 0 0 191k 0 0:01:22 0:01:22 --:--:-- 201k
  14. root@docker-01 opt]# chmod +x /usr/local/bin/docker-compose
  15. [root@docker-01 opt]# docker-compose -v
  16. docker-compose version 1.24.1, build 4667896b
  1. [root@docker-01 mywordpress]# vim docker-compose.yml
  2. vi docker-compose.yml
  3. version: '3'
  4. services:
  5. db:
  6. image: mysql:5.7
  7. volumes:
  8. - db_data:/var/lib/mysql
  9. restart: always
  10. environment:
  11. MYSQL_ROOT_PASSWORD: somewordpress
  12. MYSQL_DATABASE: wordpress
  13. MYSQL_USER: wordpress
  14. MYSQL_PASSWORD: wordpress
  15. wordpress:
  16. depends_on:
  17. - db
  18. image: wordpress:latest
  19. volumes:
  20. - web_data:/var/www/html
  21. ports:
  22. - "80"
  23. restart: always
  24. environment:
  25. WORDPRESS_DB_HOST: db:3306
  26. WORDPRESS_DB_USER: wordpress
  27. WORDPRESS_DB_PASSWORD: wordpress
  28. volumes:
  29. db_data:
  30. web_data:
  31. ==================
  32. [root@docker-01 mywordpress]# docker-compose up
  33. [root@docker-01 mywordpress]# docker-compose up -d
  34. [root@docker-01 mywordpress]# docker-compose scale wordpress=3(启动3个容器)
  35. [root@docker-01 mywordpress]# docker ps

nginx安装

  1. 启动的3个容器对外提供一个服务:配置nginx反向代理:
  2. [root@docker-02 repositories]# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  3. [root@docker-02 repositories]# sudo yum install -y nginx
  4. 配置文件:
  5. 涉及配置:upstreamlocation
  6. [root@docker-02 nginx]# cat nginx.conf
  7. user nginx;
  8. worker_processes 1;
  9. error_log /var/log/nginx/error.log warn;
  10. pid /var/run/nginx.pid;
  11. events {
  12. worker_connections 1024;
  13. }
  14. http {
  15. include /etc/nginx/mime.types;
  16. default_type application/octet-stream;
  17. sendfile on;
  18. keepalive_timeout 65;
  19. upstream wordpress {
  20. server 10.0.0.11:32769;
  21. server 10.0.0.11:32770;
  22. server 10.0.0.11:32771;
  23. }
  24. server {
  25. listen 80;
  26. server_name localhost;
  27. location / {
  28. proxy_pass http://wordpress;
  29. proxy_set_header Host $host;
  30. proxy_set_header X-Real-Ip $remote_addr;
  31. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  32. }
  33. }
  34. }
  35. [root@docker-02 nginx]#
  36. [root@docker-02 nginx]# systemctl start nginx

在目录下配置测试文件

  1. [root@docker-01 _data]# pwd
  2. /var/lib/docker/volumes/mywordpress_web_data/_data
  3. [root@docker-01 _data]# cat info.php
  4. <?php phpinfo(); ?>
  5. [root@docker-01 _data]#
  6. 不停刷新页面发现地址代理地址不同:
  7. http://10.0.0.12/info.php

restart: always---每次重启docker服务,这个容器也会重启

docker volume ls

docker network ls

十六、容器的四种网络类型

  1. None:不为容器配置任何网络功能,--net=none
  2. Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID
  3. Host:与主机共享Network Namespace,--net=host
  4. BridgeDocker设计的NAT网络模型(默认)
  1. [root@docker-01 _data]# docker run -it --network none busybox:latest
  2. 检查网络类型:
  3. docker ps -a -l
  4. docker inspect competent_lewin
  5. ----
  6. [root@docker-01 _data]# docker run -d httpd:latest
  7. dbf395b9b91dbc83fdf16535d686a2e3172520022fe9142edbef0461ea11f53c
  8. [root@docker-01 _data]# docker run -it --network container:charming_antonelli 10.0.0.12:5000/centos:6.8 ([root@docker-01 ~]# docker ps -a -l
  9. 查出name
  10. [root@dbf395b9b91d /]# netstat -lntp
  11. [root@docker-01 ~]# docker ps -a -l
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. f09de4357455 10.0.0.12:5000/centos:6.8 "/bin/bash" About a minute ago Up About a minute charming_feynman
  14. [root@docker-01 ~]# docker inspect f09de4357455
  15. network为空。
  16. host
  17. [root@docker-01 _data]# docker run -it --network host 10.0.0.12:5000/centos:6.8
  18. [root@docker-01 ~]# docker inspect (网络类型为host
  19. [root@docker-01 /]# ifconfig
  20. 跟宿主机共用。

十七、跨主机通信之macvlan

macvlan定义:

macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。

macvlan 本质上是一种网卡虚拟化技术

使用macvlan实现容器跨主机通信:

  1. 创建macvlan:(两台主机都需要)
  2. docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
  3. 测试:
  4. docker01
  5. docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
  6. ping 10.0.0.112
  7. docker02
  8. docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh
  9. ping 10.0.0.111
  1. [root@docker-01 _data]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
  2. 41476f94745165b43591760a9fe4541d0bf13d1c3498f84bd4daa8aa14fafe0f
  3. [root@docker-01 _data]# docker network ls
  4. NETWORK ID NAME DRIVER SCOPE
  5. e3f7c473d255 bridge bridge local
  6. ed8ed81588ce host host local
  7. 41476f947451 macvlan_1 macvlan local
  8. e8e53247c464 mywordpress_default bridge local
  9. e6e9a262ab5f none null local
  10. [root@docker-01 _data]# docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
  11. [root@docker-02 nginx]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
  12. 2644c26dbacfe64add4eba8a792fcaee04384d08255918590367569fe5058cd9
  13. [root@docker-02 nginx]#
  14. [root@docker-02 nginx]# docker network ls
  15. NETWORK ID NAME DRIVER SCOPE
  16. e60a56edfd03 bridge bridge local
  17. 85abdf640cbc host host local
  18. 2644c26dbacf macvlan_1 macvlan local
  19. daa49e0aaede none null local
  20. [root@docker-02 nginx]# docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh
  21. 开启混杂模式:
  22. [root@docker-01 _data]# ip link set eth0 promisc on
  23. [root@docker-01 _data]# ip link show eth0
  24. 相互可以ping通。

十八、跨主机容器间通信之overlay

  1. 1)准备工作
  2. docker03上:
  3. docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
  4. docker0102上:
  5. vim /etc/docker/daemon.json
  6. {
  7. "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
  8. "cluster-store": "consul://10.0.0.13:8500",
  9. "cluster-advertise": "10.0.0.11:2376",(本机地址)
  10. "insecure-registries": ["10.0.0.11:5000"]
  11. }
  12. 修改内容:
  13. vi /usr/lib/systemd/sytem/docker.serveice
  14. ExecStart=/usr/bin/dockerd
  15. systemctl daemon-reload
  16. systemctl restart docker
  17. 2)创建overlay网络
  18. docker network create -d overlay ol1
  19. 3)启动容器测试
  20. docker run -it --network ol1 --name oldboy02 busybox:latest /bin/sh
  21. docker run -it --network ol1 --name oldboy01 busybox:latest /bin/sh
  22. 默认vxlan的地址不要和宿主机相同,docker network create -d overlay--subnet 172.16.1.0/16 ol4 执行vxlan容器的地址。
  23. 用于容器间的通信,另一块网卡172.18.0.0/24用于外部通信。
  24. 相互可以ping通域名和ip地址。

overlay类型原理图

十九、企业级私有仓库harbor

  1. harbor-offline-installer-v1.5.1.tgz
  2. 链接:https://pan.baidu.com/s/1Z9I7zYXSt-8ve3lFT2YCeg
  3. 提取码:iuqj
  4. 第一步:安装dockerdocker-compose
  5. 第二步:下载harbor-offline-installer-v1.5.1.tgz
  6. 第三步:上传到/opt,并解压
  7. 第四步:修改harbor.cfg配置文件
  8. hostname = 10.0.0.11
  9. harbor_admin_password = 123456
  10. docker rm -f `docker ps -a -q`
  11. 第五步:执行install.sh
  12. ###
  13. ./install.sh
  14. 访问harbor:
  15. 浏览器中输入:10.0.0.11
  16. 推送镜像:
  17. [root@docker-02 _data]# vim /etc/docker/daemon.json
  18. {
  19. "registry-mirrors": [
  20. "https://dockerhub.azk8s.cn",
  21. "https://reg-mirror.qiniu.com",
  22. "https://registry.docker-cn.com"
  23. ],
  24. "insecure-registries": ["10.0.0.12:5000"],
  25. "insecure-registries": ["10.0.0.11"]
  26. [root@docker-02 _data]# systemctl restart docker
  27. 先登录:(admin123456
  28. docker login 10.0.0.11
  29. [root@docker-02 kop]# docker images
  30. [root@docker-02 kop]# docker image tag busybox:latest 10.0.0.11/library/busybox:latest(library项目名称)
  31. [root@docker-02 kop]# docker images
  32. [root@docker-02 kop]# docker push 10.0.0.11/library/busybox:latest
  33. 登录web页面检查,是否推送成功。
  34. 下载镜像:
  35. 修改下载主机的信任信息:
  36. [root@docker-02 _data]# vim /etc/docker/daemon.json
  37. "insecure-registries": ["10.0.0.11"]
  38. [root@docker-02 _data]# systemctl restart docker
  39. 直接复制web页面,让后在需要主机上黏贴。

docker深入学习的更多相关文章

  1. 在Windows环境中开始Docker的学习和体验

    研究docker有一段时间了,当然我主要的使用环境还是在Linux中,确实很方便. 但也有不少朋友希望使用Windows来工作学习,这里介绍一下在Windows中如何快速开始Docker的学习和体验吧 ...

  2. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  3. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  4. 服务器搭建远程docker深度学习环境

    服务器搭建远程docker深度学习环境 本文大部分内容参考知乎文章 Docker+PyCharm快速搭建机器学习开发环境 搭建过程中出现ssh连接问题可以查看最后的注意事项 Docker Docker ...

  5. Docker命令学习

    今天更换腾讯云系统的时候发现了多了个CoreOS,据说是专门运行docker的轻量系统,顺便学习一下docker命令. 1. docker version 显示 Docker 版本信息. 2. doc ...

  6. 有关docker的学习链接

    本文是自己搜索的比较好的网上资源,便于有兴趣者查阅. 英文官网 https://docs.docker.com/engine/getstarted/ 中文入门手册 http://www.docker. ...

  7. Docker个人学习总结

    最近一段时间学习了下Docker,关于Docker的安装,运用什么的在这里我不会过多的说明,我只说我对于Docker的一些理解,附加我用于记录的少量代码. 刚开始学习Docker的时候,找资料在网上看 ...

  8. Docker技术学习

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/1598249 貌似Doc ...

  9. Docker入门学习

    Python爬虫 最近断断续续的写了几篇Python的学习心得,由于有开发经验的同学来说上手还是比较容易,而且Python提供了强大的第三方库,做一个小的示例程序还是比较简单,这不我之前就是针对Pyt ...

随机推荐

  1. Abp 抛出详细异常

    Abp在默认情况下,只要后端抛出异常,一概过滤为服务器错误并弹出,这样并不方便调试,这个时候需要开启一个开关即可: 在模块预初始化PreInitialize中开启,代码如下: , 这样就可以看到详细的 ...

  2. JAVA系列-JVM

    1)JVM体系概述 JVM体系结构概览 JVM参数调优及相关参数 JVM的参数类型 标配参数:java-version;  java -help X参数:-Xint 解释执行: -Xcomp 第一次使 ...

  3. 《前端之路》- TypeScript (四) class 中各类属性、方法,抽象类、多态

    目录 一.TypeScript 中的类 二.TypeScript 中类的继承 三.TypeScript 中公共,私有与受保护的修饰符 3-1.属性的 public 3-2.属性的 private 3- ...

  4. [Docker6] Docker compose多容器运行与管理

    六.Docker compose docker compose就是通过yml文件来定义和运行多个容器docker应用程序的工具,三步过程就能跑起一个compose: 定义应用程序的环境(yml中) 定 ...

  5. python之道15

    请实现一个装饰器,限制该函数被调用的频率,如10秒一次(借助于time模块,time.time())(面试题,有点难度,可先做其他) 答案 # 思路 运行不能用 import time def wra ...

  6. OpenCV-Python 使用OCR手写数据集运行KNN | 五十四

    目标 在本章中 我们将使用我们在kNN上的知识来构建基本的OCR应用程序. 我们将尝试使用OpenCV自带的数字和字母数据集. 手写数字的OCR 我们的目标是构建一个可以读取手写数字的应用程序.为此, ...

  7. nltk 中的 sents 和 words

    nltk 中的 sents 和 words ,为后续处理做准备. #!/usr/bin/env python # -*- coding: utf-8 -*- from nltk.corpus impo ...

  8. TensorFlow系列专题(六):实战项目Mnist手写数据集识别

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 导读 MNIST数据集 数据处理 单层隐藏层神经网络的实现 多层隐藏层神经 ...

  9. Git使用的一些问题:.gitignore规则不生效、git同步代码至github和gitee

    Git忽略规则及.gitignore规则不生效的解决办法 .gitignore 的基本使用 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件 ...

  10. swagger2 接口文档

    1,maven: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...