自定义镜像与仓库
自定义镜像
使用镜像启动容器,在该容器基础上修改,然后另存为一个新镜像
例:docker run -it docker.io/centos
docker start 2a53112
docker commit 2a53112 docker.io/myos:latest
docker images
docker history
docker history f281
Dockerfile语法格式: #必须是此文件名,一个目录对应一个文件
-FROM :基础镜像(基于那个镜像做的)
-MAINTAINER:镜像创建者信息(输出镜像创建者的自定义信息)
-EXPOSE:开放的端口(将服务的端口开放)
-ENV:设置环境变量(环境变量减少执行命令的复杂程度)
-ADD:固执文件到镜像(将本机的文件复制到容器里面)
-RUN:制作镜像是执行的命令,可以有多个(在容器里面执行命令),run执行命令一直在家目录下,即使run cd /tmp下,下一个run还是在家目录下
-WORKDIR:定义容器默认工作目录(解决run执行命令一直在/root下,解决cd命令无效的问题)
-CMD:容器启动时执行的命令(即修改默认的启动命令),仅可以有一条CMD (格式:CMD [“ls”,"-l","-a"],是一种python格式,将命令和参数用双引号引起来,并用逗号隔开,写在中括号中)(定义的CMD命令为上帝进程)
使用Dockerfile工作流程:mkdir aa --> cd aa–> vim Dockerfile --> docker build -t 新镜像名:标签 DOckerfile所在目录
例:mkdir docker ; touch a.repo -->vim --> :r /etc/yum.repos.d/local.repo -->gpgcheck=0
touch Dockerfile --> vim -->
FROM docker.io/centos:latest
RUN rm -f /etc/yum.repos.d/*
ADD a.repo /etc/yum.repos.d/local.repo
RUN yum -y install vim net-tools iproute psmisc bash-completion
docker build -t myos:test docker/ #利用Dockerfile文件生成新镜像
例:创建一个httpd的镜像,启动容器时,自动启动httpd服务,设置默认工作目录为/var/www/html,设置默认首页为hello world
mkdir aa–> cd aa --> touch Dockerfile–> vim Dockerfile–>
FROM myos:latest
RUN yum -y install httpd
WORKDIR /var/www/html
ADD index.html index.html
ENV EnvironmentFile=/etc/sysconfig/httpd
EXPOSE 80
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
docker build -t myos:httpd .
docker run -itd myos:httpd
docker inspect ID号 #查看详细信息,找到容器ip地址
curl http://172.17.0.4
自定义镜像仓库
registry基本概念:共享镜像的一台服务器(镜像化的一台服务器)
tab键的利用(装bash-completion)
自定义私有仓库(服务端,需要有和客户端相同的yum源):yum -y install docker-distribution
启动私有仓库,并设置开机自启动: -systemctl start/enable docker-distribution
仓库配置文件及数据存储路径: -/etc/docker-distribution/registry/config.yml
-/var/lib/registry
客户端配置(docker1和Docker2): 修改配置文件 /etc/sysconfig/docker
13行 ADD_REGISTRY=’–add-registry 192.168.1.30:5000’ #仓库地址
24行 INSECURE_REGISTRY=’–insecure-registry 192.168.1.30:5000’ #允许非加密方式访问仓库
保存并重启服务(先将容器都停止):
[root@docker1 ~]# docker stop $(docker ps -aq)
7904fba025d8
a898b961823f
a392cef14816
2a531124fc92
d0cd52802627
[root@docker1 ~]# systemctl restart docker
客户端准备上传镜像: 为镜像创建标签,docker tag 镜像:标签 IP:5000/改名修改镜像名:latest
docker tag myos:httpd 192.168.1.30:5000/httpd:latest
上传镜像:上传镜像的标签内包含地址和端口号
docker push IP:5000/镜像:latest , -docker push 192.168.1.30:5000/httpd:latest
客户端下载镜像(docker2):重启Docker服务systemctl restart docker
远程启动镜像:docker run -it [可加IP地址:5000]/仓库镜像:latest
查看私有镜像仓库中的镜像名称: -curl http://IP地址:5000/v2/_catalog
查看某一仓库的标签: -curl http://地址:5000/v2/<镜像名>/tags/list
私有仓库数据存储目录:/var/lib/Registry
持久化存储
存储卷
卷的概念:docker容器不保持任何数据,重要数据请使用外部卷存储(数据持久化),容器可以挂载真实机目录或共享存储为卷
主机卷的映射:将真实机目录挂载到容器中提供持久化存储(目录不存在会自动创建,目录存在就直接覆盖掉)
docker run -v /data:/data -it docker.io/centos bash
共享存储
例:服务端创建NFS共享存储目录,权限为rw(在docker0上布置)
yum -y install nfs-utils
mkdir /centos
vim /etc/exports --> /centos 192.168.1.0/24(rw)
systemctl restart nfs-server.service
systemctl restart nfs-secure.service
exportfs -rv
chmod 777 /centos 和 chmod 777 /centos/index.html #使docker1/2用于修改index内容
echo hello world > /centos/index.html
客户端挂载共享,并将共享目录映射到容器中:
docker1:yum -y install nfs-utils
showmount -e 192.168.1.30
mkdir /mnt/docker1
mount -t nfs 192.168.1.30:/centos /mnt/docker1/
ls /mnt/docker1/
docker images
docker ps
docker run -v /mnt/docker1:/usr/share/nginx/html -itd docker.io/nginx
docker2: docker run -v /mnt/docker1:/var/www/html -itd docker.io/nginx
Docker网络架构
查看默认Docker创建的网络模型
docker network list 或者 docker network ls
查看某一特定网桥: ip a s docker0
启动容器会绑定该网桥: brctl show docker0 #命令查看网桥的详细信息
使用Docker创建网桥
[root@docker2 ~]# docker network create --subnet=10.10.10.0/24 docker1
[root@docker2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5ae877ac834e bridge bridge local
4657d13f3aec docker1 bridge local
72f758e2594f host host local
fbbb38754ee0 none null local
查看创建的网桥底层信息:docker network inspect docker1
使用自定义网桥:docker run -it --network=docker1 docker.io/centos
客户端访问容器内的资源
默认容器可以访问外网,但外部网络的主机不可以访问容器内的资源,容器的特征是可以把宿主机变成对应的服务
-使用-p参数把容器端口和宿主机端口绑定
-用法: -p 宿主机端口:容器端口
例:把docker1变成httpd服务:
[root@docker1 ~]# docker run -itd -p 80:80 myos:httpd
b05e17090695e399a472952a627404323e8af191a1bd09d2e165cbfd999607f2
[root@docker1 ~]# curl 192.168.1.31
hello world
[root@docker1 ~]# docker run -itd -p 80:80 docker.io/nginx:latest
92df179bbc1d8c56dec20960af00ac3210b25cace15a421d4fcf4fc01887a03d
[root@docker1 ~]# curl 192.168.1.31
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>