通过dockerfile定制企业镜像
将exited状态的容器全部删掉,
mkdir -p /opt/dockerfile/centos6.9_sshd
vim Dockerfile
# Centos6.9-SSHDv1.0
FROM centos:6.9
RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseurl=
ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" > /etc/yum.repos.d/ftp.repo &&
yum makecache fast && yum -y install openssh-server
RUN etc/init.d/sshd start && etc/init.d/sshd stop && echo "123456" | passwd root --stdin
EXPOSE 22 #暴露端口
EXPOSE 80
CMD ["/usr/sbin/sshd","-D"] #相当于将来用这个镜像启容器时,告诉RUN执行的第一条是sshd
FROM语法:基础镜像
- centos@2199b8eb8390(IMAGE_ID,镜像的唯一代码,这样更安全)
- centos:6.9
- centos@2199b8eb8390(IMAGE_ID,镜像的唯一代码,这样更安全)
- RUN语法:构建镜像过程中运行的命令
- && 排列多条命令,RUN每运行一条命令相当于启动一个临时容器
- [“mysqld”,”—initialize-insecure”,”—user=mysql”,”—basedir=/usr/local/mysql”] ,以mysql为例
- && 排列多条命令,RUN每运行一条命令相当于启动一个临时容器
- EXPOSE:向外暴露的端口
- CMD:使用镜像启动容器时运行的命令,一般是必加的
- [“/usr/sbin/sshd”,”-D”]
- [“/usr/sbin/sshd”,”-D”]
- 通过例子学习其他指令,例dockerfile构建lamp基础环境镜像
docker image build -t "xiaobai/centos6.9-sshd:v1.0" ./
- 相当于是,快速构建docker image
- 如果上面写的Dockerfile文件没问题,那就会一步一步的执行,如下图
- COPY:
- 将dockerfile目录下的某个文件拷贝到容器的指定目录下,可以支持通配符。
- 如果拷贝的是目录,就只会拷贝目录下的子文件子目录 cp xxx/* xxx/
- 将dockerfile目录下的某个文件拷贝到容器的指定目录下,可以支持通配符。
ADD:比上面命令多的是,可以上传并自动解压tar类的软件包到目录,tar相关文件如.tar .bz2 .xz .tar
- 可以将远程的文件上传至容器,这种的并不会解压
vim dockfile
# Centos6.9_sshd_LAMP
FROM centos:6.9
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" >
/etc/yum.repos.d/ftp.repo && yum makecache fast && yum -y install openssh-server httpd
mysql mysql-server php php-mysql
RUN /etc/init.d/sshd start && /etc/init.d/mysqld start && /etc/init.d/httpd start &&
echo "123456" | passwd root --stdin
#RUN mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;" #实现免交互
COPY init.sh /
ADD bbs.tar.gz /var/www/html/
#ADD https://mirrors.aliyun.com/centos/7.6.1810/os/xxx/xxx.rpm /tmp
EXPOSE 22
EXPOSE 80
EXPOSE 3306
CMD ["/bin/bash","/init.sh"]
#ENV CODEDIR /var/www/html/
#ENV DATADIR /data/mysql/data
#ADD bbs.tar.gz ${CODEDIR}
#VOLUME ["${CODEDIR}","${DATADIR}"]
#ENTRYPOINT ["/bin/bash","/init.sh"]
- 可以将远程的文件上传至容器,这种的并不会解压
cp /init.sh ./
init.sh脚本与dockerfile在同一目录下docker build -t "xiaobai/c69_sshd_lamp_bbs" ./
2.1 排错:
- 将
mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;"
此行命令,添加到/init.sh 脚本中mysqld启动后,就可 docker container run -d -p 80 -p 22 -p 3306 xiaobai/c69_sshd_lamp_bbs
dpcker ps -a
处于运行状态- 进行测试
- 继续其他命令:
- VOLUME:[“/var/www/html”,”/data/mysql/data”] 实现数据卷的自动挂载
- WORKDIR:
- ENV:
- ENTRYPOINT:防止启动容器时,dockerfile里的命令被手工输入的命令覆盖,防止容器秒起秒关
- 还可以做传参数使用
- 而用CMD会被替换掉
- 还可以做传参数使用
- 小节:
- COPY和ADD后面文件的路径,是以dockerfile 为起点,相对路径
yum本地源同步阿里云
启动registry,
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
- 保证重启docker或是服务器后,容器能自动重启起来
- 浏览器访问,http://宿主机IP:5000/v2/,能看到{} 说明registry运行正常
修改配置文件,
vim /etc/docker/daemon.json
"insecure-registries":["registry1的IP:5000"] 添加一行
systemctl restart docker
- 将镜像传到镜像服务器上,
- 做标签,
docker tag nginx:latest 10.0.0.100:5000/xiaobai/nginx:v1
docker push 10.0.0.100:5000/xiaobai/nginx:v1
100就是registry1IP,docker客户端为101xiaobai—将来登录镜像的用户名- 将镜像全部删除,docker rmi -f
docker image ls -a -q
- 异地进行pull镜像到本地 (10.0.0.101)
docker pull 10.0.0.100:5000/xiaobai/nginx:v1
- 本地仓库加安全认证
- 生成密码,
yum -y install httpd-tools
mkdir -p /opt/registry-auth
htpasswd -Bbn xiaobai 123 > /opt/registry-auth/htpasswd
- 重启带有秘钥功能的registry容器
- docker rm -f
docker ps -aq
docker run -d -p 5000:5000 -v /opt/registry-auth:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
docker ps -a
- 做标签,
docker tag centos:6.9 10.0.0.100:5000/xiaobai/centos:v1
5.1 pull镜像,需要login
docker login 10.0.0.100:5000
登录完了,才能够进行push操作docker push 10.0.0.100:5000/xiaobai/centos:v1
- 上面已经打了标签了,所以就直接push到仓库中去就可以。
- pull到本地,不需要用户登录
docker pull 10.0.0.100:5000/xiaobai/centos:v1
habor实现图像化镜像仓库
- 安装
docker load -i harbor.v1.5.1.tar.gz
- 安装docker和docker-compose,
yum -y install docker-compose
- 下载harbor-offline-installer-xxxx.tgz
- 上传到/opt ,并解压
- 修改harbor.cfg 配置文件,相关参数
- hostname = 10.0.0.100
- harbor_admin_password=123456
- hostname = 10.0.0.100
- 执行install.sh
- 使用方法
修改配置文件,
vim /etc/docker/daemon.json 添加以下内容
"insecure-registries":["10.0.0.100:5000,"10.0.0.100"],
"live-restore":true 保证重启后,所有镜像都会重启动,因为harbor下的容器数量很多
systemctl restart docker
- 在harbor中添加项目
- 制作镜像并上传harbor,
- 这次有两个registry,取决于你选择哪个来push
docker tag centos:6.9 10.0.0.100/xiaohei/centos:v1
docker login 10.0.0.100
docker push 10.0.0.100/xiaohei/centos:v1
- 在harbor仓库里查看,可看到新上传的镜像
- 这次有两个registry,取决于你选择哪个来push
- 在另一台主机pull镜像,也要修改配置文件,添加上registries的ip, 这里就是10.0.0.100
docker login 192.168.226.133
docker tag nginx:latest 192.168.226.133/projec_001/lzl_nginx:0.0.1
docker push 192.168.226.133/projec_001/lzl_nginx:0.0.1
之后在WEB端就能看到上传上去的镜像了- 另一台主机上pull测试
docker网络类型
本地网络类型
- 查看支持网络类型
docker network ls
- 测试使用各类网络类型
docker run network=xxx
none:无网络模式
bridge:容器的默认模式,相当于NAT。容器内会起一个和docker0同网段的地址,类似于网桥的一个结构。容器内需
要对外访问时,通过docker0的网桥与eth0之间进行内核,ip_forward进行自动转发出去上网。
host:公用宿主机Network NameSpace,所有hosts,ip,端口和宿主机是共享的
container:与其他容器公用Network NameSpace
docker run -it --name="c_bri1" --network=bridge centos:6.9 /bin/bash
docker run -it --name="c_host1" --network=host centos:6.9 /bin/bash
docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.254 -o parent=eth0 macvlan_1
- 相当于创建一个通道。使用时,两台容器内的主机要指定不同的地址, —ip=10.0.0.11
- 相当于创建一个通道。使用时,两台容器内的主机要指定不同的地址, —ip=10.0.0.11
ip link set eth0 promsic on
ubuntu或其他版本需要docker run -it --network macvlan_a centos:6.9 /bin/bash
- 不能对外上网
overlay实现
- 启动consul服务,实现网络的统一配置管理的功能
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
- kc类型的存储数据库(key:value)
- 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.100:8500”,
“cluster-advertise”:”10.0.0.100:2376”
}
- 创建overlay网络
docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 ol1
systemctl restart docker``docker network ls
- 可以看到,”SCOPE”类型为global全局的
- 可以看到,”SCOPE”类型为global全局的
- 两边启动容器测试
docker run -it --network ol1 --name xiaobai01 busybox /bin/bash
- 每个容器有两张网卡,eth0实现容器间的通讯,eth1实现容器访问外网
- 两个容器的eth0,一个是172.16.0.1,一个是172.16.0.2
底层机制
1. 存储机制
- 镜像的分层机制:
- 镜像由若干个层组成,每个层就是Dckfile中的一个指令。多个镜像间可以共享基础层,以节约宿主机的存储空间
- dockerfile里的每一个指令都是镜像当中的一层,
docker history nginx/xiaobai:v1.2
- overlay2存储驱动
补充
- docker架构
- 定义
- client(docker客户端)
- 是docker的用户界面,接收用户命令和配置标识,并与docker daemon通信
- images(docker镜像)
- 是一个只读模板,包含创建docker容器的说明。和系统安装光盘有点像,使用docker镜像可以运行docker镜像中的程序
- container(容器)
- 是image的可运行实例。image和container的关系有点类似于面向对象中,类和对象的关系。可通过docker API或者CLI命令来启停、移动、删除容器
- registry
- 注册中心。