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容器的安装

lxc容器的依赖:
依赖CentOS-Base.repo和epel.repo
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
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 安装lxc容器:(Ubuntu上开发的,在Ubuntu上可以直接使用,centos可以直接使用)
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y

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

echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0 echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.14
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5' >/etc/sysconfig/network-scripts/ifcfg-virbr0

创建并启动容器

创建lxc容器:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images
注意:
Distribution: centos
Release: 6
Architecture: amd64 设置容器的root用户密码
chroot /var/lib/lxc/centos6/rootfs passwd 启动容器:
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的安装:

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.tuna.tsinghua.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
----
上面不可用时候替换备选(阿里源):
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
---
安装docker-ce:
yum install docker-ce -y

docker的架构

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

四、启动第一个docker容器

docker容器是一种软件的打包技术,接下来我们体验一下
传统编译安装nginx:
官网下载Nginx源码包wget
tar解压源码包
创建Nginx用户
安装依赖包
编译安装三部曲configure,make,make install
修改nginx配置文件
启动nginx docker容器
docker run -d -p 80:80 nginx
命令解释:
run (创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
为了快速下载镜像:
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["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 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
[root@docker-01 docker]# docker image
build history import inspect load ls prune pull push rm save tag
build:构建镜像
history:查看构建镜像的历史
import:导入镜像(弃用)
inspect:查看镜像的详细信息
load:导入镜像
ls:查看镜像
prune:删除(已经不用)
pull:下载镜像
push:上传镜像
rm:删除镜像
save:导出镜像
tag:镜像起别名

六、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` [root@docker-01 docker]# docker container
attach cp diff export kill ls port rename rm start stop unpause wait
commit create exec inspect logs pause prune restart run stats top update

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...]
例子: (使用不同的终端vty)
docker exec -it 容器id或容器名字 /bin/bash docker attach [OPTIONS] CONTAINER
例子:(使用相同的终端vty)
docker attach 容器id或容器名字 nsenter(安装yum install -y util-linux 弃用)

容器的核心理念

docker的本质是:在隔离的环境运行的一个进程

所以:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
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运行容器端口映射的方法

指定映射(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 (随机端口)

docker自动添加iptables的规则

iptables -t nat -L -n

docker 容器的网络原理图

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

八、docker数据卷存储

为什么要要使用docker数据卷

数据卷的作用:

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

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

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

常见的docker数据卷命令

创建一个数据卷
docker volume create
查看数据卷列表
docker volume ls
删除一个数据卷
docker volume rm
查看一个数据卷的属性
docker volume inspect

数据卷应用:

docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest

根据命令查看容器位置:[root@docker-01 ~]# docker volume inspect oldboy

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镜像

制作docker镜像步骤:

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

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

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

制作支持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
---
或者使用以下这个脚本
[root@dbb708722b6c /]# cat /init.sh
#!/bin/bash
/etc/init.d/sshd start
/etc/init.d/httpd start
tail -F /var/log/httpd/access-log(可以夯住容器进程) 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

十、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:

手动制作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 oldboy centos6-ssh:v1
3: 启动新容器来测试新提交的镜像
docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
==============================
dockerfile制作docker镜像步骤:
1:编写dockerfile
vi dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"] 2:docker build构建镜像
docker build -t centos6-ssh:v2 . 3: 启动新容器来测试新构建的镜像
docker run -d -p 1422:22 centos6-ssh:v2

dockerfile实战2

手动制作支持ssh-http双服务的docker镜像
1:启动容器安装软件服务
docker run -it --name oldgirl centos:6.9
yum install httpd -y
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456|passwd --stdin root ###容器启动脚本
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
============================================ dockerfile制作docker镜像步骤:
1:编写dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh (将宿主机当前目录下的init.sh文件拷贝只容器的根目录下)
CMD [“/bin/bash",“/init.sh"]
###容器启动脚本
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D 2:docker build构建镜像
docker build -t centos6-ssh-httpd:v2 . 3:启动新容器来测试新提交的镜像
docker run -d -p 8080:80 -p 2122:22 centos6-ssh-httpd:v2

docker 实战3

[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
CMD ["/bin/bash","/init.sh"] [root@docker-01 centos6_ssh_http]# cat init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D [root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v3 .
[root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v3
[root@docker-01 centos6_ssh_http]# docker ps -a -l
[root@docker-01 centos6_ssh_http]# docker exec -it objective_pike /bin/bash

docker实战4

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

docker 容器实战5

[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
WORKDIR /root
ENV SSH_PASSWD=123456
CMD ["/bin/bash","/init.sh"] [root@docker-01 centos6_ssh_http]# cat init.sh
#!/bin/bash
echo $SSH_PASSWD|passwd --stdin root
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v6 .
[root@docker-01 centos6_ssh_http]# docker run --env "SSH_PASSWD=oldboy123" -d -P centos6-ssh-httpd:v6
[root@docker-01 centos6_ssh_http]# docker ps -a -l
[root@docker-01 centos6_ssh_http]# ssh root@10.0.0.11 -p 32779

docker 容器实战6

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

十一、dockerfile构建php项目

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

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

手工启动容器:

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

docker项目制作dockerfile文件:

curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
[root@docker-01 kop]# ll
total 13580
-rw-r--r-- 1 root root 259 Apr 12 18:27 dockerfile
-rw-r--r-- 1 root root 69 Apr 12 18:29 init.sh
-rw-r--r-- 1 root root 13894810 Apr 12 18:28 kodexplorer4.40.zip [root@docker-01 kop]# cat dockerfile
FROM centos:6.9
RUN yum install httpd php php-cli unzip php-gd php-mbstring -y
WORKDIR /var/www/html
COPY kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip
RUN chmod -R 777 /var/www/html/
ADD init.sh /init.sh
EXPOSE 80 22
CMD ["/bin/bash","/init.sh"]
[root@docker-01 kop]# cat init.sh
#!/bin/bash
/etc/init.d/httpd start
tail -F /var/log/http/access_log [root@docker-01 kop]# docker build -t kod:v1 . [root@docker-01 kop]# docker run -d -P kod:v1 [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容器间的互联

容器间互联的方法:--link  单方向的
docker run -d --name oldboy httpd:latest
docker run -it --link oldboy:web01 centos:6.8
测试:
curl oldboy
curl web01 原理:
cat /etc/hosts ========
[root@docker-01 kop]# docker run -d --name oldboy httpd:latest
[root@docker-01 kop]# docker run -it --link oldboy:web01 centos:6.9
[root@docker-01 ~]# docker inspect oldboy
[root@006f2289cc04 /]# curl -I 172.17.0.3
[root@006f2289cc04 /]# curl -I oldboy
[root@006f2289cc04 /]# cat /etc/hosts
172.17.0.3 web01 5f2c3eab08d8 oldboy
172.17.0.4 006f2289cc04
[root@006f2289cc04 /]#

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

docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest

配置监控的docker02主机:

[root@docker-02 ~]# rpm -qa | grep docker
docker-ce-19.03.5-3.el7.x86_64
docker-ce-cli-19.03.5-3.el7.x86_64
[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
[root@docker-02 ~]# vim /etc/zabbix/zabbix_agentd.conf
修改:server=10.0.0.11
[root@docker-02 ~]# systemctl restart zabbix-agent.service
打开网页监控docker02

十四、docker私有仓库registry

运行docker私有仓库

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

上传镜像到私有仓库

上传到私有仓库的步骤:
a:给要上传的镜像打tag
10.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

十五、容器编排docker-compose

安装docker-compose

安装:
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y python2-pip
pip install docker-compose
或者pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
检查是否安装成功
docker-compose -v
=============================== [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
% 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
▽root@docker-01 opt]# chmod +x /usr/local/bin/docker-compose
[root@docker-01 opt]# docker-compose -v
docker-compose version 1.24.1, build 4667896b
[root@docker-01 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: ================== [root@docker-01 mywordpress]# docker-compose up
[root@docker-01 mywordpress]# docker-compose up -d
[root@docker-01 mywordpress]# docker-compose scale wordpress=3(启动3个容器)
[root@docker-01 mywordpress]# docker ps

nginx安装

启动的3个容器对外提供一个服务:配置nginx反向代理:
[root@docker-02 repositories]# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm [root@docker-02 repositories]# sudo yum install -y nginx
配置文件:
涉及配置:upstream,location
[root@docker-02 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;
}
}
}
[root@docker-02 nginx]#
[root@docker-02 nginx]# systemctl start nginx

在目录下配置测试文件

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

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

docker volume ls

docker network ls

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

None:不为容器配置任何网络功能,--net=none

Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID

Host:与主机共享Network Namespace,--net=host

Bridge:Docker设计的NAT网络模型(默认)

[root@docker-01 _data]# docker run -it --network none busybox:latest
检查网络类型:
docker ps -a -l
docker inspect competent_lewin ----
[root@docker-01 _data]# docker run -d httpd:latest
dbf395b9b91dbc83fdf16535d686a2e3172520022fe9142edbef0461ea11f53c
[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
查出name)
[root@dbf395b9b91d /]# netstat -lntp
[root@docker-01 ~]# 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
[root@docker-01 ~]# docker inspect f09de4357455
network为空。 host:
[root@docker-01 _data]# docker run -it --network host 10.0.0.12:5000/centos:6.8
[root@docker-01 ~]# docker inspect (网络类型为host)
[root@docker-01 /]# 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
ping 10.0.0.112
docker02:
docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh ping 10.0.0.111
[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
41476f94745165b43591760a9fe4541d0bf13d1c3498f84bd4daa8aa14fafe0f
[root@docker-01 _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
[root@docker-01 _data]# docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh [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
2644c26dbacfe64add4eba8a792fcaee04384d08255918590367569fe5058cd9
[root@docker-02 nginx]#
[root@docker-02 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
[root@docker-02 nginx]# docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh 开启混杂模式:
[root@docker-01 _data]# ip link set eth0 promisc on
[root@docker-01 _data]# ip link show eth0
相互可以ping通。

十八、跨主机容器间通信之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"]
}
修改内容:
vi /usr/lib/systemd/sytem/docker.serveice
ExecStart=/usr/bin/dockerd systemctl daemon-reload
systemctl restart docker
2)创建overlay网络
docker network create -d overlay ol1 3)启动容器测试
docker run -it --network ol1 --name oldboy02 busybox:latest /bin/sh
docker run -it --network ol1 --name oldboy01 busybox:latest /bin/sh
默认vxlan的地址不要和宿主机相同,docker network create -d overlay--subnet 172.16.1.0/16 ol4 执行vxlan容器的地址。
用于容器间的通信,另一块网卡172.18.0.0/24用于外部通信。
相互可以ping通域名和ip地址。

overlay类型原理图

十九、企业级私有仓库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
docker rm -f `docker ps -a -q`
第五步:执行install.sh
###
./install.sh 访问harbor:
浏览器中输入:10.0.0.11 推送镜像:
[root@docker-02 _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"]
[root@docker-02 _data]# systemctl restart docker
先登录:(admin,123456)
docker login 10.0.0.11 [root@docker-02 kop]# docker images
[root@docker-02 kop]# docker image tag busybox:latest 10.0.0.11/library/busybox:latest(library项目名称)
[root@docker-02 kop]# docker images
[root@docker-02 kop]# docker push 10.0.0.11/library/busybox:latest
登录web页面检查,是否推送成功。
下载镜像:
修改下载主机的信任信息:
[root@docker-02 _data]# vim /etc/docker/daemon.json
"insecure-registries": ["10.0.0.11"]
[root@docker-02 _data]# systemctl restart docker
直接复制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. Jmeter Agent自动化

    1.打开菜单栏-附件-系统工具-任务计划程序,新建PerformanceTest目录. 2.在PerformanceTest目录下新建一个基本任务. 3.完成. 这样,当我们在使用Jmeter进行分布 ...

  2. idea安装 阿里巴巴Java编码准则插件

    首先还是打开熟悉的idea 在marketplace 输入 alibaba 我这是已经安装过了 下载完成之后重启idea生效 如果需要那就手动的扫描 当然已经自动的扫描了 如果你的代码不符合阿里的标准 ...

  3. android studio 添加 apache.http

  4. CF1324F Maximum White Subtree 题解

    原题链接 简要题意: 给定一棵树,每个点有黑白两种颜色:对每个节点,求出包含当前节点的连通图,使得白点数与黑点数差最小.输出这些值. F题也这么简单,咳咳,要是我也熬夜打上那么一场...可惜没时间打啊 ...

  5. git push错误,如何回滚

    --> git push Counting objects: 81, done.Delta compression using up to 4 threads.Compressing objec ...

  6. OpenCV-Python ORB(面向快速和旋转的BRIEF) | 四十三

    目标 在本章中,我们将了解ORB的基础知识 理论 作为OpenCV的狂热者,关于ORB的最重要的事情是它来自" OpenCV Labs".该算法由Ethan Rublee,Vinc ...

  7. TensorFlow 多 GPU 处理并行数据

    Multi-GPU processing with data parallelism If you write your software in a language like C++ for a s ...

  8. 纯干货 C# 通过 RFC_READ_TABLE 读取 SAP TABLE

    SAP系统又称企业管理解决方案,是全球企业管理软件与解决方案的技术领袖,同时也是市场领导者.通过其应用软件.服务与支持,SAP持续不断向全球各行业企业提供全面的企业级管理软件解决方案. 在实际开发过程 ...

  9. 解析PE文件

    最近在自学解析PE文件,根据小辣椒(CFF Explorer)以及各论坛上大佬的帖子,做了个黑屏打印PE文件的,历时7天完成,在此想跟有相关需要的同学们分享下思路,有不足之处也希望大家不吝赐教,指点出 ...

  10. 一次作业过程及其问题的记录:mysql建立数据库、建表、查询和插入等

    前言 这次的作业需要我建立一个小的数据库. 这次作业我使用了mysql,进行了建库.建表.查询.插入等操作. 以下是对本次作业相关的mysql操作过程及过程中出现的问题的记录. 正文 作业中对数据库的 ...