Docker 容器入门
1、什么是容器?
Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像运行,并由该镜像提供支持进程所需的全部文件(环境文件)。
容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
linux容器就是一个隔离的空间中,运行的进程。
说明:这个隔离的空间拥有自己的根文件系统,拥有自己的网络,主机名等
官方说明:https://www.redhat.com/zh/topics/containers/whats-a-linux-container
2、容器不是虚拟化
虚拟化使得许多操作系统可同时在单个系统上运行。
容器只能共享操作系统内核,将应用进程与系统其他部分,隔离开。
linux容器需要内核的支持namespace(隔离)和cgroup(硬件资源的限制)
3、容器和虚拟化区别
linux容器技术,容器虚拟化和KVM的区别
KVM虚拟化:
需要CPU硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
容器虚拟化:
不需要硬件的支持,不需要模拟硬件,共享宿主机的内核,启动时间秒级(没有开机启动流程)
总结:
(1)与宿主机使用同一个内核,性能损耗小
(2)不需要指令级模拟
(3)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制。
(4)避免了准虚拟机和系统调用替换中的复杂度
(5)轻量级隔离,在隔离的同时还提供共享的机制,以实现容器与宿主机的资源共享。
4、容器技术的发展进程
4.1 Chroot技术
新建一个子系统
参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
练习1:使用chroot监狱限制ssh用户访问指定目录和使用指定命令
https://linux.cn/article-8313-1.html
4.2 LXC容器
linux container(namespaces 网络命名空间隔离环境及cgroups 资源限制)
4.2.1 安装epel源
yum install epel-release -y
4.2.2 编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
4.2.3 安装lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y #安装bridge-utils才能有brctl命令,若该包没有安装,又创建桥接网卡,会发现网络起不来。
4.2.4 桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
4.2.5 修改lxc默认配置
vi /etc/lxc/default.conf
修改第2行为:lxc.network.link = br0
4.2.6 启动cgroup
systemctl start cgconfig.service
4.2.7 启动lxc
systemctl start lxc.service
4.2.8 创建lxc容器
方法1:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2:
lxc-create -t centos -n test
4.2.9 为lxc容器设置root密码:
[root@controller ~]# chroot /var/lib/lxc/centos6/rootfs passwd
Changing password for user root.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
4.2.10 为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
4.2.11 启动容器
lxc-start -n centos7
4.3 docker容器
4.3.1 docker简介
Docker是通过内核虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行.
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs.
kvm解决了硬件和操作系统之间的依赖.
docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
4.3.2 docker的安装
下载地址:https://download.docker.com/
安装:
[root@syxk ~]#wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@syxk ~]#sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@syxk ~]#yum install docker-ce -y
4.3.3 docker的主要组成部分
docker是传统的CS架构分为docker client和docker server。
[root@syxk ~]#docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2020
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2020
OS/Arch: linux/amd64
Experimental: false
4.3.4 docker远程连接设置
说明:docker默认不会监听任何端口,只能在本地使用docker客户端或者使用Docker API进行操作。(相对的开启相应端口,就会不安全些)
实现方法:https://www.reinforce.cn/t/629.html
在Linux-node1:
[root@syxk ~]#vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.11:2375
systemctl daemon-reload
systemctl restart docker.service
在Linux-node2:
[root@syxk ~]#wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@syxk ~]#sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@syxk ~]#yum install docker-ce -y
[root@syxk ~]#docker -H 10.0.0.11 info
docker主要组件有:镜像、容器、仓库。启动容器必须需要一个镜像,仓库中只存储镜像
安装Nginx步骤:
官网下载Nginx源码包
创建Nginx用户
编译安装
修改配置文件,
启动
4.3.5 启动第一个容器
docker run -d -p 80:80 nginx
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
4.3.6 docker的镜像管理
1、搜索镜像
docker search
名字/描述/受欢迎程度/是否官方/OFFICIAL为[ok],说明可以放心使用
选镜像的建议:
1、优先考虑官方
2、starts数量多
2、获取镜像
docker pull(push)
docker pull centos:6.8(没有指定版本,默认会下载最新版)
安装指定版本TAG的镜像
3、配置docker镜像加速器
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速器:https://registry.docker-cn.com
[root@syxk ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
阿里云镜像加速器:
实现方式:https://www.cnblogs.com/flying607/p/8603678.html
第三方docker镜像仓库,使用方法:
docker pull index.tenxcloud.com/tenxcloud/httpd:latest
4、查看镜像
[root@syxk ~]#docker images (list)
5、删除镜像
[root@syxk ~]#docker image rm docker.io/centos
[root@syxk ~]#docker image rm -f docker.io/centos ==>强制删除
[root@syxk ~]#docker rmi `docker images -q`
6、导出镜像
方式一:
[root@syxk ~]#docker image save centos > docker-centos7.2.tar.gz
方式二:
语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
[root@syxk ~]# docker save -o centos.tar docker.io/centos
7、导入镜像
[root@syxk ~]#docker image load -i /root/centos.tar
8、查看镜像的详细信息
[root@syxk ~]#docker image inspect docker.io/centos
4.3.7 docker的容器管理
[root@syxk ~]#docker run -d -p 80:80 nginx
run |
创建并运行一个容器 |
-d |
放在后台 |
-p |
端口映射,物理机的80端口:容器实例的80端口(将容器的80端口映射到物理机上的80端口) |
-v |
源地址(宿主机):目标地址(容器) |
nginx |
docker镜像的名字 |
[root@syxk ~]#docker run -it --name centos6 centos:6.8 /bin/sh
-i |
interactive交互 |
-t |
tty终端 |
-it |
分配交互式的终端 |
--name |
指定容器的名字 |
/bin/sh |
覆盖容器的初始命令 |
1、启动容器
docker run image_name(镜像名)
docker run -it image_name CMD
docker run == docker create + docker start
退出容器不关闭容器的方法:ctrl + p + q
2、停止容器
docker stop CONTAINER_ID(容器ID)
3、杀死容器
docker kill container_name(容器名)
4、查看容器列表
docker ps
docker ps -a
5、进入容器
方式一(推荐):
docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash
有些容器可能并没有/bin/bash,可以试着用/bin/sh.如:busybox
退出:ctrl + d
方式二:
docker attach(使用同一个终端)
docker attach [OPTIONS] CONTAINER
方式三:
nsenter(安装yum install -y util-linux)
相关详细说明(教程):https://blog.csdn.net/sqzhao/article/details/71307518
进入容器后,查看当前是什么系统.(注意 (观念):并不是所有容器都是centos系统)。
命令:cat /etc/os-release
6、删除容器
docker rm 容器名称
强制删除容器
docker rm -f 容器名称
批量删除容器
docker rm -f `docker ps -a -q`
docker rm -f $(docker ps -a -q)
docker rm $(docker ps -a -q -f status=exited)
总结:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
4.3.8 docker的网络访问
说明:docker默认是通过NAT的形式对外进行访问
默认容器取的IP地址是172.17.0.0这一网段的IP,所以这段IP默认并不能被外网进行访问.
说明:
1、docker容器通过网桥与docker0进行通信
2、docker0通过内核转发与eth0进行通信,NAT出去进行上网
3、容器的IP是172.17.0.0段的IP,所以外面的用户(互联网上的用户)或哪怕是eth0段的用户,他们是无法访问docker容器段IP,无法通信。现在外面的用户只能访问到eth0(10.0.0.11)这个IP。
4、现在想要外面的用户能够访问到docker容器段的IP,因此做端口映射来解决这类问题。通过一系列的映射解决通信相关的问题。
5、查看端口映射情况: [root@syxk ~]#iptables -t nat -L -n
4.3.9 docker的端口映射
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort |
端口映射 -p 80:80 |
-p ip:hostPort:containerPort |
配置监听地址 -p 10.0.0.11:8080:80 |
-p ip::containerPort(随机端口) |
随机分配端口 -p 10.0.0.11::80 |
-p hostPort:containerPort:udp |
指定协议 -p 8080:80:tcp |
-p 81:80 –p 443:443 |
指定多个映射 |
随机映射
docker run -P(大P)
[root@syxk ~]#docker run -d -P 10.0.0.11::80 nginx:latest
随机映射的端口范围:[root@syxk ~]#sysctl -a | grep port | grep rang
4.3.10 docker的数据卷管理
1、Nginx单端口访问.
/usr/share/nginx/html --->容器内站点目录
数据卷(文件或目录)
-v /data
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
--volumes-from
[root@syxk ~]#echo "http://www.syxk.com" > /opt/index.html
[root@syxk ~]#docker run -d -p 80:80 -v /opt/:/usr/share/nginx/html nginx:latest
[root@syxk ~]#curl 10.0.0.11
http://www.syxk.com
2、Nginx多端口访问.
[root@syxk ~]#docker cp 容器名称:/etc/nginx/nginx.conf /opt
[root@syxk ~]#cd /opt
[root@syxk ~]#cp nginx.conf nginx.conf.bak
[root@syxk ~]#grep -Ev '^$|#' nginx.conf.bak > nginx.conf
删掉: include /etc/nginx/conf.d/*.conf 这一行。并修改相应内容为如下:
[root@syxk ~]#docker run -d -p 80:80 -p 81:81 -v /opt/nginx.conf:/etc/nginx/nginx.conf -v /opt/:/opt/html nginx:latest
[root@syxk ~]#docker ps
4.3.11 手动构建docker镜像(commit)
docker commit 容器id或者容器的名字新的镜像名字[:版本号可选]
示例一:
第一步:修改
[root@syxk ~]#docker run -it -p 1022:22 centos:6.9 /bin/bash
[root@08e9ca9bf459 /]#yum install -y openssh-server
[root@08e9ca9bf459 /]#/etc/init.d/sshd start
[root@08e9ca9bf459 /]#echo "123456" | passwd --stdin root
[root@syxk ~]#netstat -antup
第二步:提交
[root@syxk ~]#docker commit 08e9ca9bf459 centos6.9_ssh:v1
[root@syxk ~]#docker images 现在可以看到就多出一个centos6.9_ssh的image镜像
第三步:测试
怎么让该镜像开机就夯住呢?
[root@syxk ~]#docker run -d -p 1024:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
最后验证:ssh 测试该1024端口.
示例二:
制作一个支持ssh登录和http 80访问的镜像.
第一步:修改
[root@syxk ~]#docker run -it centos:6.9_ssh:v1
[root@f3b2c771d32d ~]#yum install -y httpd
[root@f3b2c771d32d ~]#vim /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@f3b2c771d32d ~]#chmod +x /init.sh
第二步:提交
[root@syxk ~]#docker commit f3b2c771d32d centos6.9_ssh_http:v1
[root@syxk ~]#docker images
第三步:测试
[root@syxk ~]#docker run -d -p 1025:22 -p 80:80 centos6.9_ssh_http:v1 /bin/bash /init.sh
[root@syxk ~]#docker ps
[root@syxk ~]#curl -I 10.0.0.11
[root@syxk ~]#ssh root@10.0.0.11 -p 1025
4.3.12 dockerfile自动构建docker镜像(build)
dockerfile主要组成部分:
基础镜像信息 FROM:centos:6.9
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(与COPY不同,ADD会自动解压)
WORKDIR 我是syxk,今天刚跑完步(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)如果在ENTRYPOINT后面出现CMD,这时候CMD不在是命令,而是ENTRYPOINT的命令参数.
示例一:
[root@syxk ~]#mkdir dockerfile
[root@syxk dockerfile]#mkdir centos6.9_ssh
[root@syxk dockerfile]#cd centos6.9_ssh/
[root@syxk centos6.9_ssh]#vim dockerfile (注意:dockerfile名字唯一,不可改)
FROM centos:6.9
RUN yum install -y openssh-server
RUN /etc/init.d/sshd start
RUN echo '123456' | passwd –stdin root
CMD ["/usr/sbin/sshd","-D"]
[root@syxk centos6.9_ssh]#docker build -t centos6.9_ssh:v2 .
[root@syxk centos6.9_ssh]#docker images 查看镜像列表
验证:
[root@syxk centos6.9_ssh]#docker run -d -p 2022:22 centos6.9_ssh:v2
[root@syxk centos6.9_ssh]#ssh root@10.0.0.11 -p 2022
上述dockerfile配置文件优化
FROM centos:6.9
RUN echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts && \
curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
yum install -y openssh-server
RUN /etc/init.d/sshd start
RUN echo '123456' | passwd –stdin root
CMD ["/usr/sbin/sshd","-D"]
示例二:
制作一个支持ssh登录和http 80访问的镜像
[root@syxk dockerfile]#mkdir centos6.9_ssh_http
[root@syxk dockerfile]#cd centos6.9_ssh_http
[root@syxk centos6.9_ssh_http]#vim dockerfile
FROM centos:6.9
RUN echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts && \
curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
yum install -y openssh-server httpd
RUN /etc/init.d/sshd start
RUN echo '123456' | passwd –stdin root
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
[root@syxk centos6.9_ssh_http]#vim init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@syxk centos6.9_ssh_http]#docker build -t centos6.9_ssh_http:v2 .
测试:
[root@syxk centos6.9_ssh_http]#docker run -d -p 80:80 -p 4022:22 centos6.9_ssh_http:v2
[root@syxk centos6.9_ssh_http]#docker ps
[root@syxk centos6.9_ssh_http]#docker top bde39e27e532
[root@syxk centos6.9_ssh_http]#ssh root@10.0.0.11 -p 4022
[root@syxk centos6.9_ssh_http]#curl -I 10.0.0.11
示例三:
构建docker基本镜像
[root@syxk dockerfile]#mkdir centos6.10_bash
[root@syxk dockerfile]#cd centos6.10_bash
[root@syxk centos6.10_bash]#rz -E
[root@syxk centos6.10_bash]#ls
rootfs.tar.xzrx
[root@syxk centos6.10_bash]#vim dockerfile
From scratch
ADD rootfs.tar.xz /
CMD ['/bin/bash']
[root@syxk centos6.10_bash]#docker build -t centos6.10_bash:v1 .
[root@syxk centos6.10_bash]#docker images
[root@syxk centos6.10_bash]#docker run -it centos6.10_bash:v1
示例四:
对于上述如centos6.9_ssh_http下的dockerfile文件.存在的问题.
当使用-P参数
[root@syxk ~]#docker run -d -P centos6.9_ssh_http:v2
[root@syxk ~]#docker ps
可知:根本就不知道映射的端口.
修改centos6.9_ssh_http下的dockerfile文件,如下:
[root@syxk centos6.9_ssh_http]#vim dockerfile
FROM centos:6.9
RUN echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts && \
curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
yum install -y openssh-server httpd
RUN /etc/init.d/sshd start
RUN echo '123456' | passwd –stdin root
ADD init.sh /init.sh
EXPOSE 80
EXPOSE 22
CMD ["/bin/bash","/init.sh"]
[root@syxk centos6.9_ssh_http]#docker build -t centos6.9_ssh_http:v3 .
[root@syxk ~]#docker run -d -P centos6.9_ssh_http:v3
示例五:
[root@syxk ~]#docker run -it –env "myroot_passwd=123123" centos6.9_ssh_http:v3 /bin/bash
[root@5214a01cb9c5 /]#env | grep passwd
myroot_passwd=123123
[root@5214a01cb9c5 /]#
[root@syxk centos6.9_ssh_http]#ls
dockerfile init.sh
[root@syxk centos6.9_ssh_http]#vim init.sh
#!/bin/bash
echo $myroot_passwd | passwd –stdin root
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@syxk centos6.9_ssh_http]#vim dockerfile
FROM centos:6.9
RUN echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts && \
curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
yum install -y openssh-server httpd
RUN /etc/init.d/sshd start
ADD init.sh /init.sh
EXPOSE 80
EXPOSE 22
CMD ["/bin/bash","/init.sh"]
[root@syxk centos6.9_ssh_http]#docker build -t centos6.9_ssh_http:v4 .
[root@syxk centos6.9_ssh_http]#docker run -d -p 8022:22 –env "myroot_passwd=888666" centos6.9_ssh_http:v4
示例六:
制作一个支持ssh登陆和访问80端口出现kodexplorer的安装首页的docker镜像
思路:
1、手动搭建一次
2:、使用dockerfile自动
1、手动搭建
[root@syxk ~]#docker run -it -p 80:80 centos:6.9
[root@855d7e24c5e1 /]# echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts
[root@855d7e24c5e1 /]# curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@855d7e24c5e1 /]#yum install -y openssh-server httpd php php-cli
[root@855d7e24c5e1 /]#/etc/init.d/sshd start
[root@855d7e24c5e1 /]#/etc/init.d/httpd start
[root@855d7e24c5e1 /]#cd /var/www/html
[root@855d7e24c5e1 html]#echo '<?php phpinfo(); ?>' > index.php
说明:
Apache:调用php,是通过so库文件的形式
Nginx + php-frm
[root@syxk ~]#docker cp kodexplorer4.25.zip 855d7e24c5e1:/var/www/html
[root@855d7e24c5e1 html]#ls
Index.php kodexplorer4.25.zip
[root@855d7e24c5e1 html]#yum install -y unzip
[root@855d7e24c5e1 html]#unzip kodexplorer4.25.zip
[root@855d7e24c5e1 html]#chmod -R 777 /var/www/html
[root@855d7e24c5e1 html]#yum install -y php-mbstring php-gd -y
[root@855d7e24c5e1 html]#/etc/init.d/httpd restart
2、使用dockerfile自动
[root@syxk dockerfile]#mkdir kodexplorer
[root@syxk dockerfile]#cd kodexplorer
[root@syxk kodexplorer]#vim dockerfile
From centos6.9
RUN echo '192.168.1.2 mirrors.aliyun.com' >> /etc/hosts && \
curl -o /etc/yum.repos.d/CentOS.Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
yum install -y openssh-server httpd php php-cli php-mbstring php-gd unzip && \
/etc/init.d/sshd start
WORKDIR /var/www/html/
COPY kodexplorer4.25.zip .
RUN unzip kodexplorer4.25.zip
RUN chmod -R 777 /var/www/html
RUN echo '123456' | passwd –stdin root
ADD init.sh /init.sh
EXPOSE 22
EXPOSE 80
CMD ["/bin/bash","/init.sh"] 或者换成 ENTRYPOINT ["/bin/bash","/init.sh"]
[root@syxk kodexplorer]#vim init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@syxk kodexplorer]#docker build -t kod:v1 .
[root@syxk kodexplorer]#docker images
[root@syxk kodexplorer]#docker run -d -p 80:80 -p 8022:22 kod:v1
4.3.13 docker镜像的分层
只有容器层是可写的,容器层下面的所有镜像层都是只读的
了解分层的内容,注意:写dockerfile把变化的内容尽可能的放在dockerfile后面,这样的话,前面的内容都可以利用缓存.另外尽可能的合并docker run,这样的话就会少一些层次。
分层的最大好处是:复用.
查看分层的命令:
[root@syxk ~]#docker image history centos6.9_ssh:v2
[root@syxk ~]#docker image history –no-trunc centos6.9_ssh:v2
4.3.14 docker容器间的互联
wordpress(nginx + php)
mysql
如何实现wordpress(nginx + php) + mysql 容器之间的互联?
示例一:
[root@syxk ~]#docker run -d –name nginx01 -p 80:80 nginx
[root@syxk ~]#docker run -it –link nginx01:web01 centos:6.9 /bin/bash
[root@05a641b65e1a /]#ping 172.17.0.2 --->172.17.0.2为nginx容器的IP,使用新的容器可以访问到最初的nginx容器.
示例二:
使用docker运行zabbix-server
1、启动一个mysql的容器
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
2、启动java-gateway容器监控java服务
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
3、启动zabbix-mysql容器使用link连接mysql与java-gateway
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
4、启动zabbix web显示,使用link连接zabbix-mysql与mysql
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
5、上传docker-mysql-5.7.tar.gz zabbix-java-gateway.tar.gz zabbix-server-mysql.tar.gz zabbix-web-nginx-mysql.tar.gz导入到images中.
[root@syxk ~]#for a in `ls *.tar.gz`;do docker load -i $a;done
[root@syxk ~]#docker images
再执行上述1-4的命令.
最后访问页面
4.3.15 docker仓库registry
一、不带认证的普通仓库
1、创建仓库
[root@docker01 ~]#docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
[root@docker01 ~]#docker tag centos6.9_ssh:v2 10.0.0.11:5000/syxk/ centos6.9_ssh:v2 (格式:docker tag 镜像名:标签私有仓库地址/镜像名:标签)
[root@docker01 ~]#docker images
[root@docker01 ~]#docker push 10.0.0.11:5000/syxk/ centos6.9_ssh:v2
报错:http:server gave HTTP response to HTTPS client.
2、修改配置文件,使之支持http
[root@docker01 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
[root@docker01 ~]#systemctl restart docker
3、重新上传
[root@docker01 ~]#docker push 10.0.0.11:5000/syxk/ centos6.9_ssh:v2
4、最后准备另外一台安装了docker的VM进行验证.
[root@docker02 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
[root@docker02 ~]#docker pull 10.0.0.11:5000/syxk/centos6.9_ssh:v2
二、带basic认证的仓库
1、安装加密工具
[root@docker01 syxk]# yum install httpd-tools -y
2、设置认证密码
[root@docker01 ~]# mkdir /opt/registry-var/auth/ -p
[root@docker01 ~]# htpasswd -Bbn syxk 123456 >> /opt/registry-var/auth/htpasswd
3、启动容器,在启动时传入认证参数
[root@docker01 ~]#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
4、测试验证
[root@docker01 ~]#docker pull busybox
[root@docker01 ~]#docker tag busybox:latest 10.0.0.11:5000/syxk/ busybox:latest
[root@docker01 ~]# docker push 10.0.0.11:5000/syxk/ busybox:latest
报错:no basic auth credentials
解决办法:
[root@docker01 ~]#docker login 10.0.0.11:5000
输入用户名:syxk
密码:123456
[root@docker01 ~]# docker push 10.0.0.11:5000/syxk/ busybox:latest
#认证文件的保存位置
[root@docker01 ~]# cat .docker/config.json
{
"auths": {
"10.0.0.11:5000": {
"auth": "Y2xzbjoxMjM0NTY="
},
"https://index.docker.io/v1/": {
"auth": "Y2xzbjpIenNAMTk5Ng=="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.06.0-ce (linux)"
}
}
4.3.16 docker的编排工具(docker-compose)
[root@syxk ~]#yum install -y python2-pip(需要epel源)
[root@syxk ~]#pip install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
1、创建文件目录
[root@syxk ~]#cd /opt
[root@syxk opt]#mkdir my_wordpress
[root@syxk opt]#cd my_wordpress
2、导入wordpress-latest镜像
[root@syxk my_wordpress]#ls
wordpress-latest.tar.gz
[root@syxk my_wordpress]#docker load -i wordpress-latest.tar.gz
[root@syxk my_wordpress]#docker images
3、编写编排文件
[root@syxk my_wordpress]# vim 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
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
4、启动
[root@syxk my_wordpress]#docker-compose up
启动:docker-compose up
后台启动:docker-compose up -d
5、浏览器访问http://10.0.0.11:32768(随机端口)
最后进行wordpress的安装即可
6、补充说明
同时启动3个wordpress
[root@syxk my_wordpress]#docker-compose scale wordpress=3
[root@syxk my_wordpress]#docker ps
4.3.17 重启docker服务,容器全部退出的解决办法
方法一:
在启动时指定自动重启
docker run --restart=always
方法二:
修改docker默认配置文件
添加上:"live-restore": true
[root@syxk ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
"graph": "/opt/mydocker",
"insecure-registries":["10.0.0.11:5000"],
"live-restore": true
}
[root@syxk ~]#systemctl restart docker
4.3.18 docker网络类型
None |
不为容器配置任何网络功能,--net=none |
Container |
与另一个运行中的容器共享Network Namespace, --net=container:containerID |
Host |
与主机共享Network Namespace,--net=host |
Bridge |
Docker设计的NAT网络模型(默认类型) |
一、4种网络类型说明
1、不为容器配置任何网络功能(None)
此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。
2、与其他容器共享网络配置(Container)
此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等
3、使用宿主机网络(Host)
此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。
4、Bridge网络(默认类型)
默认4种网络详解地址:https://www.cnblogs.com/along21/p/10233746.html
二、查看网络方式
查看网络列表
[root@syxk ~]#docker network list
查看容器网络
[root@syxk ~]#docker inspect 55e339c80051 | grep -i ipaddr
[root@syxk ~]#docker network inspect bridge
4.3.18 docker跨主机通信之macvlan
创建macvlan网络
docker network create --driver macvlan --subnet 172.16.1.0/24 --gateway 172.16.1.1 -o parent=eth1 macvlan_1
设置eth1的网卡为混杂模式
ip link set eth1 promisc on
创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=172.16.1.3 busybox:latest /bin/sh
4.3.19 dcoker跨主机通信之overlay
1、准备工作
docker01上:
vim /etcdocker/daemon.josn
{
"hosts":["tcp://0.0.0.0:2375","tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"cluster-store": "consul://10.0.0.11:8500",
"cluster-advertise": "10.0.0.11:2376",
"insecure-registries": ["10.0.0.11:5000"]
"live-restore":true
}
systemctl restart docker
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
docker02、03上:
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"cluster-store": "consul://10.0.0.11:8500",
"cluster-advertise": "10.0.0.12:2376",
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
2、创建overlay网络
docker network create -d overlay ol1
docker network ls
3、启动容器测试
docker run -it --network ol1 --name syxk busybox:latest /bin/sh
4.3.20 docker企业级镜像仓库harbor
第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.3.0.tgz
[root@syxk ~]#cd /opt
[root@syxk opt]#wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
第三步:解压
[root@syxk opt]# tar xf harbor-offline-installer-v1.3.0.tgz
第四步:修改harbor.cfg配置文件
[root@syxk ~]#vim harbor.cfg
……
hostname = 10.0.0.11
harbor_admin_password = 123456
……
第五步:执行install.sh
[root@syxk ~]#./install.sh
浏览器访问 http://10.0.0.11
第六步:再上面添加一个项目
第七步:推送镜像
[root@syxk ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11"]
}
[root@syxk ~]#systemctl restart docker
[root@syxk ~]#docker tag centos:6.9 10.0.0.100/syxk/centos6.9:v1.0
[root@syxk ~]#docker login 10.0.0.11
[root@syxk ~]#docker push 10.0.0.100/syxk/centos6.9:v1.0
第八步:在web界面里查看
注意事项:正在运行的harbor机器,千万不要重启docker.直接导致无法访问了.还原:docker-compose restart 如果起不来就麻烦了,这个启动的过程也是很慢在.
Harbor故障解决办法:
docker-compose stop
docker rm -f `docker ps -a -q`
docker-compose up -d
4.3.21 用pipework为docker容器配置独立IP
示例一:
基于Docker引擎启动Nginx Web容器,默认以Bridge方式启动Docker容器,此处使用pipework工具手工给容器指定桥接网卡,并且手工配置IP地址,操作指令如下:
查看镜像列表:
docker images
运行新的Nginx容器
docker run -itd --net=none docker.io/nginx:latest
查看启动的Nginx容器
docker ps
查看nginx容器的IP地址:(没有IP地址)
docker inspect 265a3745752e | grep -i ipaddr
安装pipework IP配置脚本工具,方法如下:
安装pipework
git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
查看pipework工具是否配置正确
pipework -h
基于pipework工具手工指定容器的IP,并且设置容器为桥接方式上网,命令如下:(docker0为网桥名称,172.17.0.18/16为容器IP和掩码,172.17.0.1为容器网关)
pipework docker0 265a3745752e 172.17.0.18/16@172.17.0.1
ping 172.17.0.18 -c 2
curl -I http://172.17.0.18/
示例二:
基于Docker引擎启动Nginx WEB容器,默认为Bridge方式启动Docker容器,而且Docker0的网桥IP为172.17.0.0/16网段,可以通过指令修改Docker网桥的IP网段,例如将网桥IP段修改为10.10.0.1/16段,操作指令如下:
删除原有网络信息
service docker stop
ip link set dev docker0 down
brctl delbr docker0
iptables -t nat -F POSTROUTING
添加新的docker0网络信息 brctl addbr docker0
ip addr add 10.10.0.1/16 dev docker0
ip link set dev docker0 up
配置Docker的文件
cat>/etc/docker/daemon.json<<EOF
{"registry-mirrors":["http://docker-cn.docker.com"],
"bip":"10.10.0.1/16"
}
EOF
启动新的Docker容器,查看容器桥接网络ip地址
docker run -itd docker.io/nginx:latest
docker inspect 72fec5ccdf73 | grep -i ipaddr
示例三:
基于Docker引擎启动Nginx WEB容器,默认为Bridge方式启动Docker容器,而且Docker0的网桥IP为172.17.0.0/16网段,默认局域网的其他物理机是不能直接访问Docker容器的。
为了实现Docker容器跟局域网通信,并且实现局域网其他物理机也可以访问容器的IP(不配置NAT映射),也可以自定义桥接网络br0,将br0跟物理网卡eth0或者ens33桥接。
操作方法如下:
添加ens33网卡指定bridge网卡名称br0
cd /etc/sysconfig/network-scripts
查看ifcfg-ens33网卡IP地址
cat ifcfg-ens33
TYPE="Ethernet"
DEVICE="ens33"
ONBOOT="yes"
BRIDGE="br0"
IPADDR=192.168.0.151
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
查看ifcfg-br0网卡IP地址
cat ifcfg-br0
DEVICE="br0"
BOOTPROTO=static
ONBOOT=yes
TYPE="Bridge"
IPADDR=192.168.0.151
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
重启network网络服务
service network restart
修改docker引擎,使其读取br0网桥
cat /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="-b=br0"
启动Docker容器,设置为none模式,然后使用br0网桥,指令如下:
(br0为网桥名称,192.168.0.11/24为容器IP和掩码,192.168.0.151为容器网关)
docker run -itd --net=none --name=nginx-v1 docker.io/nginx
pipework br0 nginx-v1 192.168.0.11/24@192.168.0.151
ping 192.168.0.11 -c 2
curl -I http://192.168.0.11/
示例四:
1、Centos6.x Docker 桥接网络实战
基于Centos6.x 构建Docker桥接网络,案例方法如下:
Docker0桥接网络可以自定义,如下为自定义桥接网络的设置:
/etc/init.d/docker stop
关掉docker0
ifconfig docker0 down
删除docker0
brctl delbr docker0
增加网桥br0
yum install bridge-utils
Centos6.5 下的配置:
vim /etc/sysconfig/docker
other_args="-b=br0"
除此之外,配置bridge桥接网络可以直接设置网卡配置文件:
/etc/sysconfig/network-scripts下,修改ifcfg-eth0网卡配置,同时增加ifcfg-br0桥接网卡配置,操作流程如下:
vi ifcfg-eth0内容修改为如下:
vim ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=static
BRIDGE=br0
vim ifcfg-br0
DEVICE="br0"
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
TYPE=Bridge
查看服务器网卡信息
启动一个新的docker客户端,查看客户端IP如下:
进入已经启动过的容器命令: docker attach 容器ID 即可
docker ps -l
docker attach a4cae461d340
2、Centos7.x Docker 桥接网络实战
基于Centos7.x 构建Docker桥接网络,案例方法如下:
配置bridge桥接网络可以直接设置网卡配置文件:
/etc/sysconfig/network-scripts下,修改ifcfg-ens33网卡配置,同时增加ifcfg-br0桥接网卡配置,操作流程如下:
vi ifcfg-ens33 内容修改为如下:
DEVICE="ens33"
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"
IPADDR=192.168.43.81
NETMASK=255.255.255.0
GATEWAY=192.168.43.1
USERCTL=no
vi ifcfg-br0内容如下:
DEVICE="br0"
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
TYPE="Bridge"
IPADDR=192.168.43.81
NETMASK=255.255.255.0
GATEWAY=192.168.43.1
USERCTL=no
启动docker服务,即可:
service docker start
Docker默认提供了一个隔离的内网环境,启动时会建立一个docker0的虚拟网卡,每个容器都是连接到docker0网卡上的。而docker0的IP段为172.17.0.1,如果想让容器与宿主机同一网段的其他机器访问,就必须在启动docker的时候将某个端口映射到宿主机的端口。
KVM的桥接网络非常方便,其实docker也比较方便,至少不是自带的桥接而已,上面讲解了docker容器在centos6.5下的实现方法,现在讲解centos7下实现docker容器桥接网络,并为容器分配外网IP。如下为通过pipework工具配置容器IP方法:
安装pipework
git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
启动容器并设置网络
docker run -itd --net=none --name=lamp2 centos7 /bin/bash
pipework br0 lamp2 192.168.1.11/24@192.168.1.88
进入容器查看IP
docker exec lamp2 ifconfig
5、参考文献
1)、https://www.cnblogs.com/ajunyu/category/1502776.html
2)、https://www.cnblogs.com/sxdcgaq8080/category/1235535.html
3)、https://www.cnblogs.com/CloudMan6/tag/Docker/
5)、https://www.cnblogs.com/lonelyxmas/tag/Docker/default.html?page=1
6)、https://blog.csdn.net/sqzhao/category_6687562_1.html
7)、https://www.cnblogs.com/along21/p/8116905.html
8)、https://www.cnblogs.com/boshen-hzb/category/944022.html
9)、https://www.cnblogs.com/djoker/category/1398803.html
10)、https://blog.csdn.net/qq_37495786/category_8228836.html
11)、https://mritd.me/tags/#Docker
12)、http://k8s.unixhot.com/docker/docker-introduce.html
13)、https://blog.csdn.net/mofiu/article/details/79021550
14)、https://www.cnblogs.com/clsn/p/8410309.html#auto_id_8
15)、http://www.runoob.com/docker/docker-tutorial.html
16)、https://www.w3cschool.cn/reqsgr/su3dwozt.html
17)、https://www.aliyun.com/ss/ZG9ja2Vy/1_h?spm=5176.10695662.0.0.460d21beN5B9Oa
20)、https://www.howtoing.com/search?query=docker&page=1
21)、https://wiki.jikexueyuan.com/list/docker/
22)、http://collabnix.com/category/docker/
23)、https://blog.csdn.net/relax_hb/article/details/69668815
24)、http://blog.51cto.com/lzhnb/2153225
25)、https://www.cnblogs.com/aspirant/p/8808809.html
26)、https://yeasy.gitbooks.io/docker_practice/kubernetes/quickstart.html
27)、https://blog.csdn.net/hl_java/article/category/8292904
28)、https://recomm.cnblogs.com/blogpost/11111907?page=1
出处:https://www.cnblogs.com/syxk
^_^如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,您的“推荐” 将是我最大的写作动力^_^。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。