111111

自动化----docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.Docker简介和KVM区别
 
1.1 历史简介
 
 Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker 是通过内核虚拟化技术(namespaces及cgroups等,这里的内核技术指的是Linux内核哦)来提供容器的资源隔离与安全保证等。由于docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(Virtual Machine Monitor),以及hyperisor)支持,他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求很低。最本质特征docker是通过隔离来进行创建容器,而KVM等均为通过模拟方式创建虚拟机
 
1.2 优势说明
 
更快的交付和部署使用docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,
 
测试和原味人员可以直接使用完全相同的环境来部署代码,只要开发测试过的代码,就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间
 
更高效的资源利用 docker 容器不需要二外的徐牛啊管理程序支持,他是内核级的虚拟化,可以实现更高级的性能,同事对资源的额外需求很低
 
更轻松的迁移和扩展docker容器几乎可以再任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同事支持主流的操作系统发行版本。这种兼容性让用户可以再不同平台之间轻松地迁移应用
 
 
1.3 对比KVM
docker容器很快,启动和停止可以再秒级实现,而传统的虚拟机需要数分钟,docker容器对系统资源需求很少,一台主机上可以同时运行数百甚至上千个docker容器,docker 通过类似于git的设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新,docker通过dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化
 
1.4 docker的特性
 
Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。(一次构建多处运行,像不像JAVA呢)。docker是传统的CS架构分为docker client和docker server,主要分为三大组件镜像(image)、容器(container)、仓库(Repository)。那么docker和我们之前接触的openstack又有什么区别呢?他们的区别如下所示。

 

2.安装与配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm   ####配置yum源
yum install docker -y     ########安装DOCKER
systemctl enable docker    ############开机启动
vim /usr/lib/systemd/system/docker.service  ####编辑配置文件
ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com\  ####### 修改加速器
 
####ystemctl start docker      ########开启DOCKER
####systemctl status docker    ########  看DOCKER 状态是否成功
 
 
###################################################################docker镜像搜索,下载,查看,导出,导入操作#########################################
#### docker search nginx     ###搜索想下载的镜像                                                                                                ###
####docker pull nginx         ########下载nginx镜像                                                           ###
#### docker images            ########查看下载镜像                                                       ###
#### docker save nginx >/tmp/nginx.tar.gz    ######导出本地镜像                                                ###  
####docker rmi nginx        #########删除镜像                                                          ###
####docker load  < /tmp/nginx.tar.gz   ####导入本地镜像                                                    ###
##############/var/lib/docker/image/overlay2/layerdb ############默认镜像位置  可以 /usr/lib/systemd/system/docker.service 来设置位置        ###
####日常 --graph=/opt/docker  更换存储目录 dns服务  默认docker是才用宿主机的dns  可以才用 --dns=xxxx的方式制定     docker daemon --help  查看需求帮助  ###
################################################################################################################################################
 
 
#####docker run -it --name mynginx nginx sh  ####启动一个镜像  可以指定名字  分配个终端
#####docker ps -a               ####查看已经启动的镜像和所以镜像        #########小技巧 按住ctrl不放手p   q  退出一个容器,容易不会关闭
#####docker rm 62244e6d4104     ####删除一个容器,根据CONTAINER ID来删除,不能删除已经运行的容器,如果要删,只能先停止,,强制删除加 f    docker rm -f e2a901f136d9   ##创建在退出的时候删除,生产环境不用docker run -it --rm --name mynginx nginx
####docker inspect mynginx      ####  查看容器的详细信息
####docker exec -it mynginx bash  ### 指定进入一个容器 用bash解释器来运行
####yum install util-linux -y     ###可以用脚本进入容器
#!/bin/bash
pid=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $pid -m -u -i -n -p
####docker logs mynginx        ####可以查看容器的日志

3.镜像制作 

 # https://hub.docker.com ########docker 官方下载镜像

# docker pull centos ######下载centos 以centos作为基础

# docker run -it centos bash ########运行一个容器终端

# yum install wget -y ####安装wget 默认没有装

# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ####下载yum源做优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo         ####安装epel源
#yum install nginx -y    #####做nginx镜像
#vi /etc/nginx/nginx.conf   
daemon off;   ####前台运行<br>#docker commit -m 'add nginx images' 源镜像名或者ID  mynginx:v1         #######  根据那个镜像来创建nginx镜像      :v1是根据实际情况来打版本号用
#docker run -d --name mynginx zhaobin/my_nginx nginx  ###启动一个容器,名字为mynginx   指定镜像为zhaobin/my_nginx   命令是nginx
 
##########  网docker官网上传镜像
# docker login   ###登录
# docker images    ####显示镜像
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
zhaobin/my_nginx              v1                  b554b7de7aba        56 minutes ago      12.2 MB
docker.io/mystatus/my_nginx   latest              52a45a2aa161        57 minutes ago      12.2 MB
zhaobin/my_nginx              latest              52a45a2aa161        57 minutes ago      12.2 MB
docker.io/nginx               latest              ae513a47849c        9 days ago          109 MB
docker.io/centos              latest              e934aafc2206        4 weeks ago         199 MB
docker.io/bash                latest              59507b30b48a        3 months ago        12.2 MB
docker.io/alpine              latest              3fd9065eaf02        4 months ago        4.15 MB
# docker tag 52a45a2aa161 docker.io/mystatus/my_nginx   ###把镜像ID打个tag
# docker push docker.io/mystatus/my_nginx ####传到仓库
#####docker run  -d --name my_nginx -P nginx 端口映射 把nginx镜像端口映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.dock 端口映射以及网络管理<br>######################## # docker commit -m 'add nginx images' 73b798fa70f7 mynginx   ######通过
 
# docker run --name mynginx -d -p 80:80 mynginx nginx   ########指定端口映射  想指定UDP 在端口后面加
 # docker run --name mynginx -d -p 127.0.0.1:80:80 mynginx nginx     #####通过指定IP 或者端口来访问
# docker run --name web1 -d -p 80:80 mynginx nginx   ###########建立一个web1容器 
 
# docker run --name web2 --link web1 -d -p 8080:80 mynginx nginx      ##建立一个web2容器和web1互通
# docker run -d --name web2 --link web1:shop_web -p 8080:80 mynginx nginx ###  可以指定个show_web别名
# docker run -it --rm --net=host nginx  ##########可以指定网络模式为host,默认bridge模式 
# vim /usr/lib/systemd/system/docker.service  #######可以更改默认的网段
--bip=172.18.42.1/16    加上这个
# systemctl daemon-reload
# systemctl restart docker
##############2个主机之间的docker互通 需要加一条路由来指定 例如
rout add -net 192.168.2.0/24 -gw 192.168.1.1  意思我要访问2.0这个网段走1.1这个网关

5.docker数据管理

1
2
3
4
5
6
7
8
9
10
1.分为数据卷
# docker run -it --name web1 --rm -v /data centos bash #把系统/目录挂载到容器的/data目录 区别是使用/分区  
# docker run -it --name web1 --rm -v /opt/:/opt/ centos bash  ####意思是创建一个web1容器 退出的时候删除容器   -v指定 把宿主机的opt目录挂载到容器的opt目录 使用centos镜像 bash解释器  ###在生产环境里例如web,宿主机跟新文件了 docker容器也跟新可以被访问
# docker run -it --name web1 --rm -v /etc/hosts:/opt/hosts centos bash ####也可以挂载文件
# docker run -it --name web1 --rm -v /etc/hosts:/opt/hosts:ro centos bash ### 也可以设置为只读  默认权限是可读可写 ,这样的话在容器里不可以卸载
 
2.数据容器
# docker run -it --name web1  -v /opt/:/opt/ centos bash ####
# docker run -it --name web2 --volumes-from web1  centos bash ###意思是数据容器指定为 web1的挂载共用 , 这样可以把web1容器关了或者删除也不影响web2容器使用数据分区
# docker rm -fv web2    #####如果使用了数据容器的方式 要记得删除的时候+v把磁盘释放,否则会把数据盘堆满<br><br><br><br>

6.docker-file 编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#this is dockerfile for nginx
#基础镜像,基于centos做的镜像
FROM centos
#维护者信息 
MAINTAINER    zhao  zhao@163.com
#相关操作
RUN rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y
#添加文件
ADD index.html /usr/share/nginx/html/index.html
#参数
RUN echo "daemon off;"  >> /etc/nginx/nginx.conf
#设置开放端口
EXPOSE 80
#执行命令
CMD ["nginx"]
 
###docker build -t zhao/nginx /root/ ##执行命令  指定相关信息 以及Dockerfile文件所在路径

7. docker私库搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#cd opt
#mkdir  auth
#docker run --entrypoint htpasswd registry:2 -Bbn zhaosir 123456 > auth/htpasswd    ##创建一个加密的密码
#docker run -d -p 5000:5000 --restart=always --name registry1 \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
 
#docker ps
# docker login 127.0.0.1:5000
#docker tag d71a151b2c01 127.0.0.1:5000/zhaobin/mynginx   ##打包要上传的镜像
#docker push 127.0.0.1:5000/zhaobin/mynginx   ##上传<br><br># docker pull 127.0.0.1:5000/zhaobin/mynginx     ####下次用到镜像的话 可以从上面下载

8.docker的编排

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# yum install python-pip -y
#pip install docker-compose
#docker-compost version
 
#mkdir /root/comose/
cd /root/comose/
vim docker-compose.yml
web1:
  image: nginx
  expose:
    - 80
 
web2:
  image: nginx
  expose:
    - 80
haproxy:
  image: haproxy
  volumes:
    - /opt/haproxy.cfg:/usr/local/etc/haproxy/haproxy.conf
  links:
    - web1
    - web2
  ports:
    - "7777:1080"
    - "80:80"
 
#docker-compose -d up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
使用docker安装mysql服务
使用docker官方镜像安装mysql服务
 
1 拉取mysql镜像,采用网易加速地址
docker pull hub.c.163.com/library/mysql:5.7
 
2 重命名镜像名
docker tag hub.c.163.com/library/mysql:5.7 mysql:5.7
 
3 创建用于挂载的目录
sudo mkdir /my/mysql/datadir #用于挂载mysql数据文件
sudo mkdir /my/mysql/conf.d #用于挂载mysql配置文件
sudo chown yaoren:docker /my #修改/my目录拥有者
 
4 使用镜像创建容器
docker run --name mysql5.7 -p 3306:3306 -v /my/mysql/datadir:/var/lib/mysql -v /my/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
命令解析:
--name:容器名
 
--p:映射宿主主机端口
 
-v:挂载宿主目录到容器目录
 
-e:设置环境变量,此处指定root密码
 
-d:后台运行容器
 
5 测试是否成功
 
mysql -h192.168.2.102 -p3306 -uroot -p
 
参考链接
https://itbilu.com/linux/docker/EyP7QP86M.html

  

 面试题:运行一个容器限制内存200M,运行一段时间后更新上限为1G。

              docker  run  -m 209715200 -d nginx                限制内存为200M

             docker update -m 400000000 --memory-swap 400000000 nostalgic_rosalind                             设置内存 合swap大小

    面试题:

          docker底层资源限制用什么实现的?

                 使用linux cgroup技术实现的。

      为什么要做资源限制???

               不设置内存限制,每个容器都认为自己拥有宿主机最大使用内存,设置限制后可以控制使用成本,避免影响其他容器运行。

   将容器的80端口映射到88端口,请说出该命令都做了那些事。

            底层对应了一个iptables规则,使用DNAT技术。

    面试题:

         1.  1个dockerfile中可以写多少个FROM指令?或者说from有啥作用。

               (1)指定基础镜像。

                  2.   可以写多个from指令,用于多阶段构建。

                  3. 引用onbuild触发指令。

        2. copy和ADD指令的区别。

               1. copy常用2个作用,拷贝文件,多阶段构建copy。

                2. add 拷贝文件别解压tar包文件。

       3. cmd和entrypoint的区别

          1. cmd和entrypoint都不使用。意味没有默认command.

          2. 单独用cmd,就默认使用cmd。

          3. 单独使用entrypoint,默认使用entrypoint。

          4. cmd和entrypoint都使用,意味entrypoint为命令,cmd为参数。

 

posted @   赵SIR  阅读(285)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示