一:使用国内仓库
1:修改内核参数
[root@localhost dockerfile]# vim /etc/sysctl.conf
在末尾添加:
net.ipv4.ip_forward=1
2:对于大于1.9的docker版本可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
此文件原本不存在,需要创建
[root@localhost ~]# vim /etc/docker/daemon.json
添加如下代码:
{
"registry-mirrors": ["https://v10sz3o0.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.1.149:8000"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
注释:
https://v10sz3o0.mirror.aliyuncs.com为申请的阿里专属加速器
如果没有专属加速器,可以使用其他国内仓库:https://registry.docker-cn.com
没有此文件表示使用默认的docker官方仓库
Docker镜像加速地址可以在阿里上申请
https://cr.console.aliyun.com/cn-hangzhou/mirrors
3:测试拉取镜像
二:构建私有仓库
1:在仓库服务器上构建私有仓库
(1)拉取registry镜像
[root@localhost ~]# docker pull 192.168.1.149:8000/registry
或导入registry镜像
[root@localhost ~]# docker load --input registry
(2)启动registry容器,并挂载本地目录
[root@localhost ~]# docker run -d -p 8000:5000 -v /data/registry:/var/lib/registry registry
7e0ba35b8a0c7c85df48a51857b43466bc57e5b7f57ab416d5e42dd31258290e
注释:
Registry默认的镜像目录是/var/lib/registry,老版本的在/tmp/registry目录
-v选项是将宿主机的目录/data挂载给registry的/var/lib/registry目录
注意:docker镜像仓库的端口号默认为5000,
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e0ba35b8a0c registry "/entrypoint.sh /etc…" 9 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp relaxed_poincare
2:在Docker主机上使用私有仓库
(1)修改仓库地址
[root@localhost ~]# vim /etc/docker/daemon.json
添加如下代码:
{
"insecure-registries": ["192.168.10.105:8000"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
(2)拉取镜像
[root@localhost ~]# docker pull 192.168.10.105:8000/centos1804
(3)上传镜像
将镜像标签重命名(必须)
[root@localhost ~]# docker tag 192.168.10.105:8000/centos1804 192.168.10.149:8000/mycentos
上传到私有仓库
[root@localhost ~]# docker push 192.168.10.105:8000/mycentos
一:Docker镜像的创建
1:基于已有的镜像创建(此处模拟一个环境迁移的步骤)
(1)先拉取或导入一个镜像
[root@localhost ~]# docker pull 192.168.1.149:8000/centos1804
(2)使用上面的镜像创建一个容器
[root@localhost ~]# docker run -dit 192.168.1.149:8000/centos1804 /bin/bash
[root@localhost ~]# docker ps -a
(3)登录到容器
[root@localhost ~]# docker exec -it ae /bin/bash
登录成功后可以对容器进行修改,比如创建文件或目录,修改系统参数等
(4)退出容器后,用此容器创建一个新的镜像
[root@localhost ~]# docker commit ae mycent:latest
(5)导出此镜像
[root@localhost ~]# docker save -o mycent c5
(6)将此镜像拷贝到其他服务器中导入,完成环境的迁移
2:基于本地模板创建
(1)下载模板
[root@localhost ~]# wget http://download.openvz.org/template/precreated/ubuntu-12.04-x86_64-minimal.tar.gz
(2)导入模板
[root@localhost ~]# cat ubuntu-12.04-x86_64-minimal.tar.gz |docker import - myubuntu:new
[root@localhost ~]# docker images
注意:横杠两边有空格
二:基于DockerFile创建镜像
1:什么是Dockerfile
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建
2:Dockerfile指令的特征:
只支持Docker自己定义的一套指令,不支持自定义
大小写不敏感,但是建议全部使用大写
根据Dockerfile的内容顺序执行
3:典型的Dockerfiler
[root@localhost ~]# mkdir /opt/dockerfile
[root@localhost ~]# cd /opt/dockerfile/
(1)设置内核参数(必须有这一步,否则镜像无法桥接到宿主网络)
[root@localhost dockerfile]# vim /etc/sysctl.conf
在末尾添加:
net.ipv4.ip_forward=1
(1)创建dockerfile
[root@localhost dockerfile]# vim dockerfile
FROM 192.168.1.129:8000/centos1804
MAINTAINER The CentOS Project <cloud-ops@centos.org>
#RUN yum -y update
RUN rm -rf /etc/yum.repos.d/*
ADD myrepo.repo /etc/yum.repos.d/myrepo.repo
RUN yum clean all
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#RUN systemctl disable httpd
CMD ["/run.sh"]
注意:如果使用私有仓库
FROM 192.168.1.149:8000/centos
(2)创建apache的启动脚本
[root@localhost dockerfile]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
注释:
rm -rf /run/httpd/* 清除http缓存
exec /usr/sbin/apachectl -D FOREGROUND 启动http进程
(3)创建网页测试文件
[root@localhost dockerfile]# echo "www.benet.com">index.html
(3)创建yum仓库文件
[root@localhost dockerfile]# vim myrepo.repo
[myrepo]
name=myrepo
baseurl=ftp://192.168.1.149/yum-1804
gpgcheck=0
enabled=1
注意:提前在宿主机上部署好ftp的yum源
(4)生成镜像
[root@localhost dockerfile]# docker build -t myhttpd .
注意:最后有个点,点前有空格
--no-cache 构建镜像时不使用缓存
-f 指定dockerfile的位置
-t 指定镜像的标签信息
(5)查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myhttpd latest 55a6d9335cca 3 minutes ago 396MB
(6)创建并开启容器
[root@localhost ~]# docker run -d -i -p 8080:80 myhttpd
c179d1acb9812f2412b2cb9ef00d22e249c7e6ebdcf7ee8acf180df36e0960c4
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c179d1acb981 myhttpd "/run.sh" 4 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp thirsty_roentgen
b33c723b6528 registry "/entrypoint.sh /etc…" 10 minutes ago Up 9 minutes 0.0.0.0:5000->5000/tcp practical_lumiere
(6)查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7cca4a122ef myimage "/run.sh" 8 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp adoring_noether
(7)测试网站访问
[root@localhost ~]# curl http://192.168.10.105:8080
test html
四:Docker的数据管理
1:创建数据卷
(1)创建卷
[root@localhost ~]# docker run -d -it -v /data1 -v /data2 --name cent01 192.168.1.149:8000/centos1804 /bin/bash
febaed9a3ddc925470346e5bf9b8bd78f15c6d963a3bae4bc1a7dc84a41e4430
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79b0c86314a3 192.168.1.149:8000/centos1804 "/bin/bash" 3 hours ago Up 3 hours mycent01
注释:
-v:在容器中创建数据卷
(2)进入容器可以看到创建的两个卷
[root@localhost ~]# docker exec -it 63 /bin/bash
2:在创建数据卷的同时挂载主机目录
(1)创建卷
[root@localhost ~]# docker run -d -it -v /web1:/data1 -v /web2:/data2 --name cent02 192.168.1.149:8000 /bin/bash
(2)进入容器,在卷中创建一个测试文件
[root@localhost /]# docker exec -it cent02 /bin/bash
[root@febaed9a3ddc /]# cd /data1
[root@febaed9a3ddc data1]# touch test
[root@febaed9a3ddc data1]# exit
Exit
(3)主机上查看挂载点的测试文件
[root@localhost /]# ls /web1
test
2:典型案例
为lamp创建数据卷,并挂载到主机上,在主机上发布网站
(1)拉取或导入lamp镜像
[root@localhost ~]# docker pull 192.168.1.149:8000/tutum-lamp
(2)创建数据卷并将容器的网站根目录挂载主机目录
[root@localhost ~]# docker run -dit -v /www:/var/www/html -p 80:80 --name mylamp 192.168.1.149:8000/tutum-lamp /bin/bash -c /run.sh
注意:
Lamp的容器网站根目录在/var/www/html下
[root@localhost ~]# docker ps -a
(2)查看mylamp容器的ip地址
[root@localhost ~]# docker inspect mylamp | grep IP
注释:
查看容器的ip地址
(3)创建测试网页
[root@localhost ~]# cd /www
[root@localhost www]# echo "aa">index.html
(4)访问网站
(5)创建php测试网站
[root@localhost ~]# cd /www
[root@localhost www]# vim index.php
<?php
phpinfo();
?>
(6)访问网站
(7)创建数据库连接测试文件
[root@localhost ~]# vim /www/index.php
<?php
$link=mysqli_connect('172.17.0.2','root','');
if($link)
echo "CONNECT SUCCESS";
mysqli_close($link);
?>
注意:ip地址是容器的ip,数据库不要设置密码,保持容器参数默认即可
3:数据卷容器
数据卷容器用于在容器之间共享数据
(1)用镜像centos创建容器mycent01,并为此容器创建数据卷
[root@localhost ~]# docker run -d -it -v /data1 -v /data2 --name mycent01 192.168.1.149:8000/centos1804 /bin/bash
(2)用镜像centos创建容器mydb,并挂载mycent01中的数据卷
[root@localhost ~]# docker run -d -it --volumes-from mycent01 --name mydb 192.168.1.149:8000/centos1804
(3)测试数据共享
[root@localhost ~]# docker exec -it mycent01 /bin/bash
[root@5ecd613c88b3 /]# touch /data1/aaa
[root@5ecd613c88b3 /]# touch /data2/bbb
[root@5ecd613c88b3 /]# exit
Exit
[root@localhost ~]# docker exec -it mydb /bin/bash
[root@1cefc839e1cc /]# ls /data1
aaa
[root@1cefc839e1cc /]# ls /data2
bbb
4:端口映射
将容器的指定端口映射给主机的ip对应的端口
[root@localhost ~]# docker run -d -it -p 8080:80 -v /www:/var/www/html --name mylamp07 192.168.1.149:8000/tutum-lamp /bin/bash -c /run.sh
注意:
访问测试时,因为使用的端口映射,要使用主机的自身ip访问映射出来的端口
此案例访问时用http://192.168.10.105:8080
5:容器互联
(1)创建源容器
[root@localhost ~]# docker run -d -it -P --name web1 centos /bin/bash
(2)创建接收容器
[root@localhost ~]# docker run -d -it -P --name web2 --link web1:web1 192.168.1.149:8000/centos1804 /bin/bash
注释:--link web1:web1
第一个web1是容器web1
第二个web1是在web2容器中生成web1的名称,是一个别名
(3)查看两个容器的IP
[root@localhost ~]# docker inspect web1 | grep IP
[root@localhost ~]# docker inspect web2 | grep IP
(4)进入容器ping测试对方容器的名称
[root@localhost ~]# docker exec -it web2 /bin/bash
[root@8249174c6e4c /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.8 web1 b5c4b419b2b1
172.17.0.9 8249174c6e4c
[root@8249174c6e4c /]# ping web1