Docker容器管理技术-基础应用

1. Docker的前世今生

1.1 什么是容器?

百度百科解释(引用于百度百科图片):

image.png

image.png
容器是一种基础工具;泛指可以容纳其他物品的工具。可以部分或者完全封闭,被用于容纳、存储、运输物品;物体可以被放置在容器中,容器可以保护内容物。
人类使用容器的历史,至少有数十万乃至百万年。
例如:瓶、罐、箱、篮、桶、杯。。。
NO!NO!NO!跑题了,并非我们今天要研究的主要话题!(-:

1.2 什么是Linux的容器(LXC--LinuX Container)?

1.2.1 主机虚拟化与容器的区别

image.png

1.2.2 容器发展之路

    容器技术最早出现在FreeBSD上叫做 jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行。
    后来,jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot以及namespaces实现资源的隔离。
    容器技术出现的主要目的是为了"资源隔离"
image.png
image.png
Linux在内核中通过namespaces,原生支持6种资源隔离,并且直接通过系统调用对外进行输出。
另外,仅靠namespaces,就可以完成容器的功能吗?
对,我们还需要靠CCgroups 控制每个namespace中的资源分配。

image.png
image.png

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体系结构

image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,382评论 0 27
  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流...
    5不忘初心0阅读 447评论 0 1
  • docker容器 docker容器1:什么是容器?2:容器和虚拟化的区别3:容器技术的发展过程:1):chroot...
    青衫忆笙666阅读 1,444评论 0 0
  • Gerrit的push 需加上分支,如为master分支提交则为: 简单点说,就是refs/for/mybranc...
    Art_Collector阅读 2,416评论 0 2
  • 如若时间往回拨转,问求学时期的我抑或是身边的同学,你能想象杨某某在运动场上不间断地跑步三十多分钟或是近五公里...
    桐梓22阅读 887评论 1 0