自定义镜像
制作模板(包含yum源,软件包net-tools psmisc vim-enhanced)
[root@docker01 ~]# docker run -it centos:latest /bin/bash
[root@a341db7d6937 /]# cd /etc/yum.repos.d/
[root@a341db7d6937 yum.repos.d]# rm -rf *.repo
[root@a341db7d6937 yum.repos.d]# ls
[root@a341db7d6937 yum.repos.d]# vi local.repo
[server]
name=server
baseurl=ftp://192.168.1.254/CentOS7.4
gpgcheck=0
enabled=1
[root@a341db7d6937 yum.repos.d]# yum repolist
repolist: 9591
[root@a341db7d6937 yum.repos.d]# yum provides pstree
psmisc-22.20-15.el7.x86_64...
Filename : /usr/bin/pstree...
[root@a341db7d6937 yum.repos.d]# yum -y install psmisc net-tools vim-enhanced
[root@a341db7d6937 ~]# exit
退出容器,创建模板 docker commit IDs 镜像文件:标签
[root@docker01 ~]# docker ps -aq
a341db7d6937
[root@docker01 ~]# docker commit a34 mycentos:latest //另存为一个新的镜像
sha256:bd08de39637c3304402119bad6e97944cea33289b1c4838e9dea5abcdcae445f
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos latest bd08de39637c 15 seconds ago 362.9 MB
[root@docker01 ~]# docker history mycentos
IMAGE CREATED CREATED BY SIZE COMMENT
bd08de39637c 40 seconds ago /bin/bash 164.3 MB
e934aafc2206 9 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 9 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
<missing> 9 months ago /bin/sh -c #(nop) ADD file:f755805244a649ecca 198.6 MB
使用新的模板验证(刚才创建的模板是否有我们安装的内容)
[root@docker01 ~]# docker run -it mycentos:latest /bin/bash
[root@23e6c3a9bd6b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
...
[root@23e6c3a9bd6b /]# pstree -p
bash(1)---pstree(17)
[root@23e6c3a9bd6b /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id repo name status
server server 9591
repolist: 9591
Dockerfile制作
格式:touch Dockerfile(文件名必须为这个)
FROM 基础镜像
MAINTAINER 镜像创建者信息
EXPOSE 开放的端口
ENV 设置变量
ADD(复制文件到镜像) 当前路径文件(不支持绝对路径) 镜像内文件路径
RUN 制作镜像时执行的命令,可以有多个(容器内运行的命令)
WORKDIR 定义容器默认工作目录
CMD 容器启动时执行的命令,仅可以有一条CMD ["/路径/命令","选项","参数"]
使用Dockerfile工作流程
mkdir build;cd build
vim Dockerfile
制作镜像 docker build -t imagename Dockerfile所在目录
制作一个yum镜像
[root@docker01 ~]# cp /etc/yum.repos.d/local.repo .
[root@docker01 ~]# vim Dockerfile
FROM centos:latest
RUN rm -rf /etc/yum.repos.d/*.repo
ADD local.repo /etc/yum.repos.d/local.repo
RUN yum -y install psmisc net-tools vim-enhanced
[root@docker01 ~]# docker build -t test:latest .
Complete!
---> e7e6df25bf17
Removing intermediate container 59f262e70de7
Successfully built e7e6df25bf17
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest e7e6df25bf17 2 minutes ago 310.8 MB
在yum镜像的基础上,运行ssh服务
查看systemd是如何启动的,/usr/lib/systemd/system/sshd.service
环境变量:EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS(在环境变量里没有相关说明,可以省略)
[root@guo ~]# vim Dockerfile
FROM mycentos:latest
RUN yum -y install openssh-server initscripts
RUN sshd-keygen
RUN echo '123456' | passwd --stdin root
ENV EnvironmentFile=/usr/sysconfig/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
书写Dockerfile 安装apache 默认启动为httpd 修改首页 设置默认工作目录为 /var/www/html
[root@docker01 ~]# vim Dockerfile
FROM mycentos:latest
RUN yum -y install httpd
RUN echo 'ServerName localhost' > /etc/httpd/conf.d/aa.conf
ENV EnvironmentFile=/etc/sysconfig/httpd
WORKDIR /var/www/html
RUN echo 'hello world' > /var/www/html/index.html
EXPOSE 80
EXPOSE 443
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
[root@docker01 ~]# docker build -t centos:httpd .
...
Successfully built 3685501bb754
[root@docker01 ~]# docker run -itd centos:httpd
012effeca693034b9d66c81e5539d1472985902054e89513fb4a8aeb05ac114e
[root@docker01 ~]# curl 172.17.0.2
hello world
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
012effeca693 centos:httpd "/usr/sbin/httpd -DFO" 33 seconds ago Up 30 seconds 80/tcp jolly_raman
自定义镜像仓库
registry 共享镜像的一台服务器( 镜像化的一台服务器)
docker run -p: 端口映射,格式为:主机(宿主)端口:容器端口
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.11:5000"] //使用私有仓库运行容器
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker run -itd -p 5000:5000 registry
0b709d150d29af22d93c476bb49f953818b5eba7fb57cd10c28abfe60d2a2779
[root@docker01 ~]# curl 192.168.1.11:5000/v2/
{} //出现括号
[root@docker01 ~]# docker tag busybox:latest 192.168.1.11:5000/busybox:latest
[root@docker01 ~]# docker push 192.168.1.11:5000/busybox:latest
The push refers to a repository [192.168.1.11:5000/busybox]
683f499823be: Pushed
latest: digest: sha256:511cc7e65ef7ccf13f417962c2f71297d3b132f12c95909de6c85ac3c326a827 size: 527
[root@docker01 ~]# curl http://192.168.1.11:5000/v2/busybox/tags/list //查看镜像的标签busybox为镜像的名字
{"name":"busybox","tags":["latest"]}
[root@docker01 ~]# curl 192.168.1.11:5000/v2/_catalog //查看镜像
{"repositories":["busybox"]}
[root@docker01 ~]#
在客户端验证
[root@docker02 ~]# scp docker01:/etc/docker/daemon.json /etc/docker //因为没做域名
ssh: Could not resolve hostname docker01: Name or service not known
[root@docker02 ~]# scp 192.168.1.11:/etc/docker/daemon.json /etc/docker
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.1.11's password:
daemon.json 100% 48 2.4KB/s 00:00
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.11:5000"]
}
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.11:5000/busybox latest 3a093384ac30 2 weeks ago 1.199 MB
[root@docker02 ~]# docker run -it 192.168.1.11:5000/busybox:latest
[root@docker02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fad382004219 192.168.1.11:5000/busybox:latest "sh" 5 minutes ago Up 5 minutes romantic_nobel
持久化存储
docker容器不保持任何数据,重要数据使用外部卷存储(数据持久化) 容器可以挂载真实机目录或共享存储为卷
主机卷的映射:将真实机目录挂载到容器中提供持久化存储
共享存储:一台共享存储服务器可以提供给所有Docker主机使用,如共享存储服务器(NAS,SAN,DAS等)
docker run -itd 镜像:标签 -v 宿主机路径:容器内路径
案例:拓扑简易模型如下,要求实现客户端挂载共享,并将目录映射到容器,docker1更新文件,daoker2实现同步更新
NFS服务器(192.168.1.254)——switch——Docker主机1(192.168.1.10)
\——Docker主机2(192.168.1.20)
NFS服务器
[root@room9pc01 ~]# yum -y install nfs-utils
[root@room9pc01 ~]# mkdir /content
[root@room9pc01 ~]# vim /etc/exports
/content *(rw,no_root_squash)
[root@room9pc01 ~]# systemctl restart nfs-server.service
[root@room9pc01 ~]# systemctl restart nfs-secure.service
[root@room9pc01 ~]# exportfs -rv
exporting *:/content
[root@room9pc01 ~]# chmod 777 /content
[root@room9pc01 ~]# echo 11 > /content/index.html
NFS客户端
[root@docker1 oo]# yum -y install nfs-utils
[root@docker1 oo]# systemctl restart nfs-server.service
[root@docker1 oo]# showmount -e 192.168.1.254
Export list for 192.168.1.254:
/content *
[root@docker1 ~]# mkdir /mnt/test
[root@docker1 ~]# mount -t nfs 192.168.1.254:/content /mnt/test
[root@docker1 ~]# ls /mnt/test
index.html
[root@docker1 ~]# cat /mnt/test/index.html
11
[root@docker1 ~]# docker run -d -p 80:80 -v /mnt/test:/var/www/html -it myos:http
224248f0df5d795457c43c2a7dad0b7e5ec86abdc3f31d577e72f7929f020e01
[root@docker1 ~]# curl 192.168.1.10
11
[root@docker2 ~]# yum -y install nfs-utils
[root@docker2 ~]# showmount -e 192.168.1.254
Export list for 192.168.1.254:
/content *
[root@docker2 ~]# mkdir /mnt/test
[root@docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/test
[root@docker2 ~]# docker run -d -p 80:80 -v /mnt/test:/var/www/html -it 192.168.1.10:5000/myos:http
00346dabec2c7a12958da4b7fee6551020249cdcb111ad6a1058352d2838742a
[root@docker2 ~]# curl 192.168.1.20
11
[root@docker1 ~]# touch /mnt/test/a.sh
[root@docker1 ~]# echo 22 > /mnt/test/index.html
[root@docker2 ~]#ls /mnt/test/
a.sh index.html
[root@docker2 ~]# cat /mnt/test/index.html
22
Docker网络架构
案例:
自定义网桥——创建网桥设备docker01 设定网段为172.30.0.0/16 启动nginx容器,桥接到docker01 映射真实机8080端口与容器的80端口
新建docker1网络模型
[root@docker1 ~]# docker network create --subnet=172.30.0.0/16 docker01
c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462
[root@docker1 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
bc189673f959 bridge bridge local
6622752788ea docker01 bridge local
53bf43bdd584 host host local
ac52d3151ba8 none null local
[root@docker1 ~]# ip a s
[root@docker1 ~]# docker network inspect docker01
[
{
"Name": "docker01",
"Id": "c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.30.0.0/16"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
使用自定义网桥启动并映射端口
[root@docker1 ~]# docker run --network=docker01 -id nginx #使用自定义网桥
[root@docker1 ~]# docker run -p 8080:80 -id nginx #端口映射
e523b386f9d6194e53d0a5b6b8f5ab4984d062896bab10639e41aef657cb2a53
[root@docker1 ~]# curl 192.168.1.10:8080
如果发现自己创建的网桥名字却不显示,需要这么做
例如新建一个网桥docker02
[root@docker1 ~]# docker network create --driver bridge docker02
//新建一个 名为docker02的网络模型
5496835bd3f53ac220ce3d8be71ce6afc919674711ab3f94e6263b9492c7d2cc
[root@docker1 ~]# ifconfig
//但是在用ifconfig命令查看的时候,显示的名字并不是docker02,而是br-5496835bd3f5
br-5496835bd3f5: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:89:6a:a2:72 txqueuelen 0 (Ethernet)
RX packets 8 bytes 496 (496.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 496 (496.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@docker1 ~]# docker network list //查看显示docker02(查看加粗字样)
NETWORK ID NAME DRIVER SCOPE
bc189673f959 bridge bridge local
5496835bd3f5 docker02 bridge local
53bf43bdd584 host host local
ac52d3151ba8 none null local
2)我们注意到bridge的NETWORK ID 为 bc189673f959
3)查看其信息
[root@docker2 ~]# docker network inspect bc189673f959
...
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0", #可以看到有一个这样的字段
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
4)把刚才创建的docker02删除
[root@docker1 ~]# docker network rm docker02 //删除docker02
docker02
[root@docker1 ~]# docker network create \
docker02 -o com.docker.network.bridge.name=docker02 //创建docker02网桥
648bd5da03606d5a1a395c098662b5f820b9400c6878e2582a7ce754c8c05a3a
[root@docker1 ~]# ifconfig //ifconfig查看有docker02
docker02: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:94:27:a0:43 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5)如果想在创建其他网段时候也显示名字 比如创建docker03
[root@docker1 ~]# docker network create docker03 --subnet=172.30.0.0/16 -o com.docker.network.bridge.name=docker03
f003aa1c0fa20c81e4f73c12dcc79262f1f1d67589d7440175ea01dc0be4d03c
[root@docker1 ~]# ifconfig //ifconfig查看,显示的是自己定义的网段
docker03: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.30.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:27:9b:95:b3 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0