1. Docker的前世今生
1.1 什么是容器?
百度百科解释(引用于百度百科图片):
容器是一种基础工具;泛指可以容纳其他物品的工具。可以部分或者完全封闭,被用于容纳、存储、运输物品;物体可以被放置在容器中,容器可以保护内容物。
人类使用容器的历史,至少有数十万乃至百万年。
例如:瓶、罐、箱、篮、桶、杯。。。
NO!NO!NO!跑题了,并非我们今天要研究的主要话题!(-:
1.2 什么是Linux的容器(LXC--LinuX Container)?
1.2.1 主机虚拟化与容器的区别
1.2.2 容器发展之路
容器技术最早出现在FreeBSD上叫做 jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行。
后来,jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot以及namespaces实现资源的隔离。
容器技术出现的主要目的是为了"资源隔离"
Linux在内核中通过namespaces,原生支持6种资源隔离,并且直接通过系统调用对外进行输出。
另外,仅靠namespaces,就可以完成容器的功能吗?
对,我们还需要靠CCgroups 控制每个namespace中的资源分配。
1.2.4 LXC到Docker的历史
LXC,将原来需要手工编码实现的容器技术,进行了封装。实现了,更加方便、快速的容器创建及管理的技术。通过固有“模板”,安装并启动容器。将远程的程序包下载到本地,安装并创建好我们需要的容器。
确实,LXC已经很大程度上降低了容器管理的难度,但是依然使用一些弊端。有些时候可能需要自定制模板,以及使用LXC中自带的模板,以及大规模创建及复制依然比较麻烦。所以,很难大规模的应用。
所以,出现了Docker技术。Docker是在LXC基础上,使用GoLang二次开发的封装版。
2. Docker安装部署
2.0、环境准备
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.1 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r
2.2 安装docker-ce
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
2.3 启动Docker服务
systemctl daemon-reload
systemctl restart docker
docker version
docker info
2.4 配置镜像加速
阿里云Docker-hub
https://cr.console.aliyun.com/cn-hangzhou/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
EOF
或者:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
3. Doocker体系结构
4. Docker的镜像基础管理
4.1 获取镜像
docker search centos
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx
4.2 查询镜像
docker images
docker images -q
docker inspect ID/name:tag
4.3 删除镜像
docker rmi IID
docker rmi `docker images -q`
docker rmi $(docker images -q)
4.4 导入导出镜像
[root@docker ~]# docker image save nginx >/opt/nginx.tar.gz
[root@docker ~]# docker image load -i /opt/nginx.tar.gz
5. Docker容器基础管理
5.1 容器体验
docker run -it --name="test_vim" 3fe2fe0dab2e /bin/bash
docker run -d -p 8080:80 --name="discuz" nginx:1.14
5.1 容器的多类启动方式
交互式启动
[root@docker ~]# docker run -it --name "testcentos" centos:6.9 /bin/bash
主要是针对于工具类的容器,一旦exit容器,容器就自动关闭
守护式启动
1.交互式启动容器+Ctrl+p+q
[root@docker ~]# docker run -it --name "testnginx" nginx /bin/bash
加ctrl+p+q
[root@docker ~]# docker attach testnginx
2.死循环
docker run --name testnginx1 -d nginx /bin/sh -c "while true ;do echo hello world; sleep 1;done"
3.服务前台运行
sshd -D
nginx -g ""
5.2docker容器的网络访问
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(随机端口)
-p hostPort:containerPort/udp
-p 81:80 –p 443:443
随机映射
docker run -P 80(随机端口)
5.3 容器的其他管理
docker ps -a -q -l
docker top testxx
docker inspect
docker attach 容器ID|容器名称(工具类)配合ctrl+p+q
docker exec -i -t 容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用
[root@docker ~]# docker exec -it centos6.9 /bin/bash
[root@oldboy docker]# docker logs testxx
[root@oldboy docker]# docker logs -t testxx
[root@oldboy docker]# docker logs -tf testxx
[root@oldboy docker]# docker logs -tf --tail 10 testxx
[root@oldboy docker]# docker logs -tf --tail 0 testxx
6. Docker容器持久化存储——volume卷管理
6.1 启动挂载数据卷
[root@docker httpd]# docker run -d -p 8083:80 --name "http8083" -v /opt/Volume/httpd:/usr/local/apache2/htdocs httpd
733eefea35456e47e71775b502e0376aff24b55612fe3030c8690d22870e8f29
[root@docker httpd]# docker run -d -p 8084:80 --name "http8084" -v /opt/Volume/httpd:/usr/local/apache2/htdocs httpd
47d3059e9aa8af3322665815748c065ba6ad26d6f81fa60b61261873889deb40
[root@docker httpd]# curl 10.0.0.110:8083
test volume
[root@docker httpd]# curl 10.0.0.110:8084
test volume
6.2 数据卷容器
docker run -it --name "httpd_volumes" -v /opt/Volume/httpd_volume/conf:/usr/local/apache2/conf -v /opt/Volume/httpd_volume/html:/usr/local/apache2/htdocs centos:6.9 /bin/bash
ctrl p q
拷贝数据到数据卷中
/opt/Volume/httpd_volume/html
/opt/Volume/httpd_volume/conf
docker cp DOCKERNAME:/opt/a.txt /opt
使用数据卷容器
docker run -d -p 8085:80 --volumes-from httpd_volumes --name "http8085" httpd
docker run -d -p 8086:80 --volumes-from httpd_volumes --name "http8086" httpd
6.3 使用数据卷容器进行备份(了解一下)
docker run --volumes-from httpd_volumes --name "httpd_volumesbak" --rm -v /backup:/backup:rw centos:6.9 tar cvf /backup/conf.tar /usr/local/apache2/conf
docker run --volumes-from centosv1 --name "centosrestore" --rm -v /backup:/backup:rw centos tar xvf /backup/conf.tar
7. Docker镜像制作
7.1 基于容器制作镜像
ssh例子:
[root@docker ~]# docker rm -f `docker ps -qa`
[root@docker ~]# docker run -it --name "oldguo_sshv1" centos:6.9 /bin/bash
[root@df8386465269 /]# passwd
mv /etc/yum.repos.d/*.repo /tmp
echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.110/pub/centos6\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
yum makecache fast && yum install openssh-server -y
/etc/init.d/sshd start ----->重要:ssh第一次启动时,需要生成秘钥,生成pam验证配置文件
/etc/init.d/sshd stop
"hang" 运行sshd,并丢到后台
/usr/sbin/sshd -D
docker commit oldguo_sshv1 oldguo/sshd:v1
练习:
nginx 手工制作镜像
nginx -g "daemon off;"
7.2 基于Dockerfile构建简易镜像
7.2.1 基本功能介绍
FROM
Syntax:
FROM <repo>:[:<tag>]
or
FROM <repo>@<ImageID>
LABEL
Syntax:
LABEL DEV="oldguo <22654481@qq.com>"
RUN
CMD
ENTRYPOINT
7.2.2 高级功能
EXPOSE
ADD
COPY
VOLUME
USER
ENV
WORKDIR
ONBUILD
7.2.3 案例书写
例子: centos 6.9+SSH
[root@docker test]# cat dockerfile
FROM centos:6.9
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum makecache fast && yum install openssh-server -y
RUN echo "123456"|passwd --stdin root
RUN /etc/init.d/sshd start
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
[root@docker test]#
小练习
1. httpd: dockerfile
apache2 -D FOREGROUND
2.双服务 sshd+httpd
cat opt/Dockerfile/app/ssh_httpd
[root@docker ssh_httpd]# cat Dockerfile
FROM centos:6.9
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.110/pub/centos6\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum makecache fast && yum install openssh-server -y
RUN yum install -y httpd
RUN echo "123456"|passwd --stdin root
RUN /etc/init.d/sshd start
EXPOSE 22
EXPOSE 80
ADD ssh_httpd.sh /opt/ssh_httpd.sh
CMD ["/bin/bash","/opt/ssh_httpd.sh"]
VOLUME /var/www/html
[root@docker ssh_httpd]# cat ssh_httpd.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
双服务 sshd+httpd +volumns
mkdir -p /opt/Dockerfile/app/ssh_httpd_vol
[root@docker ssh_httpd]# vim Dockerfile
FROM centos:6.9
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.110/pub/centos6\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum makecache fast && yum install openssh-server -y
RUN yum install -y httpd
RUN echo "123456"|passwd --stdin root
RUN /etc/init.d/sshd start
EXPOSE 22
EXPOSE 80
ADD ssh_httpd.sh /opt/ssh_httpd.sh
VOLUME /var/www/html
CMD ["/bin/bash","/opt/ssh_httpd.sh"]
[root@docker ssh_httpd]# cat ssh_httpd.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
docker build -t "oldguo/ssh_httpd_vol:v1" .
centos7.5+sshd
方法1:
## Centos7.5
[root@docker sshd]# cat dockerfile
FROM centos:7.5.1804
FROM centos:7.5.1804
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install -y sed
RUN yum install net-tools* -y
RUN yum install iproute-* -y
RUN yum install NetworkManager -y
RUN mkdir /var/run/sshd
RUN echo 'UseDNS no' >> /etc/ssh/sshd_config
RUN sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
RUN echo 'root:123456' | chpasswd
RUN /usr/bin/ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
方法二:
##制作支持systemd的7.5镜像
https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/10
https://access.redhat.com/articles/754933
FROM centos:7.5.1804
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
FROM oldguo/centos7.5:v1
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum makecache fast
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install -y sed
RUN yum install net-tools* -y
RUN yum install iproute-* -y
RUN yum install NetworkManager -y
RUN echo 'root:123456' | chpasswd
RUN systemctl enable sshd
EXPOSE 22
CMD ["/usr/sbin/init"]
测试
docker run -tid --privileged=true --name testssh -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 2022:22 test:v1
9. Docker构建私有registry
9.1 启动registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
9.2 修改配置文件
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.100:5000"]
}
[root@docker docker]# systemctl restart docker
9.3 制作本地镜像并push到
[root@docker ~]# docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1
[root@docker ~]# docker images
[root@docker ~]# docker push 10.0.0.100:5000/oldguo/nginx:v1
9.4 异地进行pull镜像
[root@docker ~]# docker pull 10.0.0.100:5000/oldguo/nginx:v1
9.5 本地仓库加安全认证
生成密码:
yum install httpd-tools -y
mkdir /opt/registry-auth/ -p
htpasswd -Bbn oldguo 123 > /opt/registry-auth/htpasswd
9.6 重新启动带有秘钥功能的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
9.7 push镜像,需要进行login
[root@oldboy ~]# docker login 10.0.0.100:5000
Username: oldguo
Password:
10. 重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
.....
......
"live-restore": true
}
11. habor实现图形化register
第一步:安装docker和docker-compose
yum install -y docker-compose
第二步:下载harbor-offline-installer-vxxx.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456
第五步:执行install.sh