通过Dockerfile创建镜像
Dockerfile
• Dockerfile语法格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– COPY:复制文件到镜像(所有文件复制场合)
– ENTRYPOINT:容器启动时执行的命令(CMD的内容将会作为参数传递给NENTRYPOINT)
– VOLUME:卷
– USER:指定当前用户(要事先创建目录)
– EXPOSE:开放的端口
– ENV:设置变量
– HEALTHCHECK:健康性检查
– ADD:复制文件到镜像(仅在需要自动解压缩的场合使用)
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录(要事先创建目录)
– CMD:容器启动时执行的命令,仅可以有一条CMD
看容器内端口起没起:# docker top ed39b0c55906
ctrl+z bg 后台运行并查看
排错:如果在启动容器的时候,提示iptables的相关问题,无法启动容器,可以执行以下操作:
(1)查看iptables是否正常
[root@room8pc30 ~]# iptables -t nat -nL # 如果只看到有限的4个CHAIN,里面又没有规则,说明iptables有误
(2)关闭docker
[root@room8pc30 ~]# systemctl stop docker.service
(3)清空nat表
[root@room8pc30 ~]# iptables -t nat -F
(4)删除docker0网络
[root@room8pc30 ~]# ifconfig docker0 down
[root@room8pc30 ~]# brctl delbr docker0
(5)启动docker
[root@room8pc30 ~]# systemctl start docker.service
(6)查看iptables,如果发现多出了很多规则,意味着已经恢复默认配置
[root@room8pc30 ~]# iptables -t nat -nL
镜像优化:
1、每个容器只运行一个进程
2、不要假定容器能够久远保持启动状态
3、使用.dockerignore文件将不需要的文件进行排除。
4、不要完全自己制作镜像,应该使用官方提供的镜像
5、尽量减少镜像的层数。如不要运行多个RUN,而是将多个命令放到一个RUN中执行
运行最小的镜像
# docker run busybox echo Hello World
通过centos 基础境像制作一个新的镜像
配置yum
安装ifconfig
安装openssh-server httpd
设置sshd和httpd在运行容器时默认开启
通过root(密码123456)和ssh服务 可以远程连接容器
可以远程访问web
多台web共享数据 局域网内共享
物理机:
#mkdir /chroot
#yum -y install nfs-utils
#vim /etc/exports
/chroot 192.168.4.0/24(rw)
#systemctl start nfs
#ls -R/abc:
Dockerfile rh7.repo(yum仓库) run.sh
#vim Dockerfile
FROM centos
MAINTAINER wangshu [email protected]
RUN rm -rf /etc/yum.repos.d/*
ADD rh7.repo /etc/yum.repos.d/rh7.repo
RUN yum clean all
RUN yum repolist all
RUN yum -y install net-tools psmisc httpd openssh-server
RUN echo 123456 | passwd --stdin root
EXPOSE 22
EXPOSE 80
ADD run.sh /usr/sbin/run.sh
CMD ["/usr/sbin/run.sh"]
#vim run.sh
#!/bin/bash
EnvironmentFile=/etc/sysconfig/sshd
/usr/sbin/sshd-keygen &>/dev/null
/usr/sbin/sshd
EnvironmentFile=/etc/sysconfig/httpd
/usr/sbin/httpd -DFOREGROUND
#chmod 755 run.sh
#echo aaa > /chroot/index.html
#docker build -t myos .
#docker run -d -p 80:80 -p 10022:22 -v /chroot:/var/www/html myos
3 私有仓库
自定义镜像仓库和docker hub
registry基本概念
• 共享镜像的一台服务器(镜像化的一台服务器)
创建私有仓库
方法1
[root@s62 simple6]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.122.2:5000 --registry-mirror=http://aad0405c.m.daocloud.io
方法2
#cat /etc/docker/daemon.json
{
"insecure-registries" : ["192.168.2.10:5000"]
}
[root@s62 simple6]# systemctl daemon-reload(重载配置文件)
[root@s62 simple6]# systemctl restart docker
[root@s62 simple6]# docker run -id -p 5000:5000 registry //启动容器映射端口
[root@s62 simple6]# docker tag a:label 192.168.122.2:5000/a:label //打标签 /镜像a
[root@s62 simple6]# docker push 192.168.122.2:5000/a:label 上传
[root@s62 simple6]# docker rmi 192.168.122.2:5000/a:label //先删除本地镜像
[root@s62 simple6]# docker run -itd 192.168.122.2:5000/a:label
[root@s62 simple6]# firefox http://192.168.122.2:5000/v2/_catalog //查看远程镜像
[root@s62 simple6]#firefox http://192.168.122.2:5000/v2/_catalog /镜像名/tags/list //查看镜像标签
部署Harbor私有镜像仓库
环境要求与准备
Harbor以容器的形式进行部署, 因此可以被部署到任何支持Docker的Linux发行版, 并且具备如下环境:
- Python2.7+
- Docker Engine 1.10+
- Docker Compose 1.6.0+
这里使用CentOS7.3的系统, Python2.7系统自带了, 剩下的就是安装Docker和Compose:
[root@harbor01 ~]# yum install docker -y
[root@harbor01 ~]# yum -y install epel-release
[root@harbor01 ~]# yum install python-pip -y
[root@harbor01 ~]# pip install docker-compose (pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose) # 查看安装完成的Docker和Compose的版本 [root@harbor01 ~]# docker version
[root@harbor01 ~]#
docker-compose --version
下载harbor包
wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.1.2.tgz
openssl req -x509 -days 3650 -nodes -newkey rsa:2048 -keyout /data/cert/server.key -out /data/cert/server.crt
Common Name (eg, your name or your server's hostname) []: harbor.wangshu.cn //域名
cd harbor/ && ./prepare
./install.sh
启动Harbor
解压完过后再harbor目录下有一个install.sh, 执行它来进行安装
[root@harbor01 harbor]# ./install.sh
[root@harbor01 harbor]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up
harbor-db /usr/local/bin/docker-entr ... Up 3306/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:1514->10514/tcp harbor-ui /harbor/start.sh Up nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
然后访问: https://harbor.wangshu.cn
访问harbor报错502 Bad Gateway
#tail -100 /var/log/harbor/adminserver.log
#tail -100 /var/log/harbor/jobservice.log
原因是我们指定的secretkey_path 路径创建的文件没有权限
还原设置secretkey_path的路径为/data
切换harbor的安装目录执行以下操作
[root@localhost harbor]#docker-compose down
[root@localhost harbor]#rm -rf /data/secretkey
[root@localhost harbor]#./prepare
[root@localhost harbor]#docker-compose up –d
登录时报错:
Error response from daemon: Get https://registry.niudingfeng.com/v1/users/: x509: certificate signed by unknown authority
此种情况多发生在自签名的证书,报错含义是签发证书机构未经认证,无法识别。
把harbor上的server.crt上传到任意docker上
chmod 644 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
cat server.crt >>/etc/pki/tls/certs/ca-bundle.crt
chmod 444 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
systemctl restart docker
证书是docker的daemon需要用到的,重启docker服务:
注意:
docker client解析不了域名的必须要加hosts