学习docker(三)

一、Docker介绍

1、docker容器
docker是宿主机的一个进程,通过namespace实现了资源隔离,通过cgroup实现了资源限制,
通过写时复制技术(copy-on-write)实现了高效的文件操作

2、容器技术的发展过程
1) chroot技术
完整的根文件系统(FHS)标准的
2) LXC(LinuXContainer)
namespaces(命名空间): 隔离环境
cgroups: 资源的分配和监控

3、namespace介绍
UTS:    隔离主机名与域名
IPC:    隔离进程间的通信
PID:    隔离进程ID
NET:    隔离网络
MOUNT:  隔离挂载点(文件系统)
USER:   隔离用户和组(3.8内核后支持)

4、CGroup 介绍
资源限制:       对任务使用的资源总额进行限制
优先级分配:     通过分配的CPU时间片数量以及磁盘IO,带宽大小,控制了任务的优先级
资源统计:       统计系统的资源使用量,如CPU时长、内存使用量等
任务控制:       对任务执行挂起、恢复等操作

5、docker组件
镜像、容器、仓库

二、docker安装

1、yum源
http://mirrors.aliyun.com/docker-ce/linux/centos/

2、安装docker
# yum install yum-utils device-mapper-persistent-data lvm2      #安装依赖包
# yum list docker-ce.x86_64 --showduplicates                    #列出所有版本
# yum install docker-ce                                         #安装最新版本
# yum install --setopt=obsoletes=0 docker-ce-17.03.2*           #安装指定版本(完整版本名)

3、启动Docker服务
# systemctl daemon-reload
# systemctl restart docker
# docker version
# docker  info

4、配置国内镜像加速
# vim /etc/docker/daemon.json
  {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
  }
# systemctl daemon-reload
# systemctl restart docker

5、docker info命令的详解
Server:
 Containers: 4                                          #主机运行的容器总数
  Running: 1                                            #正在运行的容器
  Paused: 0                                             #暂停的容器
  Stopped: 3                                            #停止的容器
 Images: 2                                              #镜像数
 Server Version: 19.03.9                                #docker版本
 Storage Driver: overlay2                               #存储引擎
  Backing Filesystem: xfs                               #系统文件系统
  Supports d_type: true                                 #是否支持d_type(分层的功能)
  Native Overlay Diff: true                             #是否支持差异数据存储
 Logging Driver: json-file                              #日志类型
 Cgroup Driver: cgroupfs                                #Cgroup类型
 Plugins:                                               #插件
  Volume: local                                         #卷
  Network: bridge host ipvlan macvlan null overlay      #支持的网络类型
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog   #支持的日志类型
 Swarm: inactive                                        #是否支持Swarm
 Kernel Version: 3.10.0-693.el7.x86_64                  #宿主机内核版本
 Operating System: CentOS Linux 7 (Core)                #宿主机操作系统
 OSType: linux                                          #宿主机操作系统类型
 Architecture: x86_64                                   #宿主机架构
 CPUs: 1                                                #宿主机CPU数量
 Total Memory: 1.938GiB                                 #宿主机总内存
 Name: docker                                           #宿主机hosrname
 ID: HRW7:I23X:RFNF:A26S:NLT7:VJRF:DUW2:FF5H:VVXF:AQFX:SEDY:F77R
 Docker Root Dir: /var/lib/docker                       #宿主机数据目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/                  #默认仓库
 Labels:                                                #标签
 Experimental: false                                    #是否测试版
 Insecure Registries:                                   #非安全的镜像仓库
  127.0.0.0/8
 Registry Mirrors:
  http://hub-mirror.c.163.com/
 Live Restore Enabled: false

三、Docker的镜像基础管理

1、获取镜像
# docker search centos                                  #优先选择官方,其次stars数量多的

2、下载镜像
# docker pull centos:7                                  #如果不指定版本,默认最新版本

3、查看镜像列表
# docker image ls
# docker images                                         #简写
# docker image ls --no-trunc                            #查看详细信息

4、只看镜像ID
# docker image ls -q

5、查看镜像详细信息
# docker image inspect nginx:latest   
# docker image inspect 965ea09ff2eb     

6、导入导出镜像
# docker image load -i /tmp/centos7.tar                 #导入
# docker load </tmp/centos7.tar                         #简写导入
# docker image save centos:7 -o /tmp/centos7.tar        #导出
# docker save centos:7 >/tmp/centos7.tar                #简写导出    

7、删除镜像
# docker image rm centos:latest                         #删除指定镜像
# docker image rm -f `docker image ls -q`               #强制删除所有镜像
# docker image prune                                    #删除未使用的映像
# docker rmi centos:7                                   #简写
# docker rmi -f centos7
# docker rmi $(docker images ls -q)

8、镜像打标签
# docker image tag e445ab08b2be ngx:v1

 四、容器的管理

1、交互式的容器
# docker container run -it  9f                              #启动容器,无镜像,自动下载
# docker container ls                                       #查看容器
# docker container run -it --name="test01" 9f               #启动容器并命名
# docker container ls -a                                    #查看所有容器
# docker container run -it --name="test02" --rm 9f          #退出容器,自动删除
应用场景: 开发,测试,临时性的任务

2、守护式容器
# docker run -d --name="test03" nginx:1.14                  #后台启动容器
# docker container inspect test03                           #查看容器的详细信息
应用场景: 网络服务

3、容器的启动和关闭
# docker container start test01                             #守护式容器的启动
# docker container stop test01
# docker container start -i test03                          #交互式容器的启动
# docker container stop test03
# docker container kill test03                              #杀死容器 

4、容器的进入方法
# docker container attach test03
# docker container exec -it test03 /bin/bash

5、容器的网络访问
# docker container run -d -p 80:80 nginx                    #指定端口
# docker container run -d -p 10.0.1.205:8080:80 nginx       #指定ip及端口
# docker container run -d -p 10.0.1.205::80 nginx           #随机端口映射
# docker container run -d -p 80 nginx                       #随机端口映射
# docker container run -d -P nginx                          #随机端口映射
# docker container run -d -p 81:80/udp nginx                #指定协议
# docker container run -d -p 82:80 -p 443:443 nginx         #指定多个端口

6、容器前台和后台的运行
ctrl + p 加 ctrl + q                                        #容器的后台运行
# docker container attach  epic_meitner                     #将后台容器调到前台

7、容器的其他管理
# docker ps -a  -q    等价于: docker container ls -a -q
# docker  top  ba916 等价于: docker container top ba916
# docker logs test03                                        #查看docker日志
# docker logs -tf --tail 10 test03                          #-t(时间戳),-f(时时追踪),tail(最后几行)
# docker inspect 8da3b                                      #查看日志文件的路径
# docker rm test03                                          #删除容器
# docker rm -f test03                                       #强制删除容器
# docker inspect test03                                     #查看详细信息
# docker run --restart=always -it --name=test03 nginx       #随docker自动运行
# docker update --restart=always test03                     #修改已创建的容器
# vim /etc/docker/daemon.json                               #随docker自动运行
  "live-restore": true
# docker top test03                                         #查看容器的进程

五、docker的数据卷

1、手工交互数据
# docker container cp index.html n1:/usr/share/nginx/html/

2、数据卷(数据持久化)
# docker container run -it -v /opt/data:/opt centos
# docker container run -it -v /opt/data:/opt:ro centos      #指定挂载权限

3、数据卷容器
# docker run -it -v /opt/data:/opt --name "mydata" centos   #创建挂载容器
# docker run -it --volumes-from mydata --name "test" centos #创建数据卷容器
# docker volume ls                                          #查看数据卷
# docker volume inspect mydata                              #查看数据卷的详细
# docker rm -fv test                                        #删除容器和数据卷
# docker volume prune                                       #删除未被使用数据卷,慎用

六、docker的镜像制作

1、手动镜像制作
# docker run -it --name="centos_6.9" centos:6.9             #启动基础镜像
# yum install openssh-server -y                             #安装软件包
# service sshd start                                        #启动sshd服务(第一次启动,生成秘钥和pam验证文件)
# echo '123456'|passwd --stdin root                         #设置root密码
# docker container commit 4229a centos_sshd:v1              #镜像制作
# docker run -d -p 33:22 centos_sshd:v1 /usr/sbin/sshd -D   #启动新镜像容器

2、构建lamp平台
1) 启动基础镜像
# docker run -it --name="centos_6.9" centos:6.9             
2) 安装软件
# yum install openssh-server htppd mysql-server php php-mysql 
3) sshd 初始化
# service sshd start                                       
# echo '123456'|passwd --stdin root  
4) mysqld 初始化
# /etc/init.d/mysqld start
mysql> grant all on *.* to root@'%' identified by '123';
mysql> grant all on *.* to discuz@'%' identified by '123';
mysql> create database discuz charset utf8;
5) apache初始化
# /etc/init.d/httpd start
6) 创建启动脚本
# cat init.sh 
  #!/bin/bash
  /etc/init.d/mysqld start 
  /etc/init.d/httpd start
  /usr/sbin/sshd -D
# chmod 777 init.sh 
7) 启动容器
# docker commit c3fd5 lamp:v1
# docker run -d --name="bbs" -p 80:80 -v /data/mysql:/var/lib/mysql -v /data/html:/var/www/html lamp:v1 /data/init.sh

3、制作centos7镜像(sshd)
1) 启动基础镜像并安装sshd软件
# docker run -it --name="centos7_sshd" centos:7.5
# yum install openssh-server -y  
2) 初始化sshd服务
# mkdir /var/run/sshd
# echo 'UseDNS no' >> /etc/ssh/sshd_config
# sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
# echo 'root:123456' | chpasswd
# /usr/bin/ssh-keygen -A
3) 启动容器
# docker commit centos7_sshd centos7_sshd:v1
# docker container run -d --name=sshd_1 -p 222:22 centos7_sshd:v1 /usr/sbin/sshd -D

4) 启动容器的其他方法
# docker run -d --name=sshd_2 --privileged=true 98sd6 /usr/sbin/init  #已特权用户创建容器
# docker run --privileged -d -p 222:22 centos7_sshd:v1 /usr/sbin/init

七、dockerfile自动构建镜像

1、dockerfile常用指令
FROM(基础镜像)
    FROM    centos:6.9
    FROM    centos@2199b8eb8390(更安全)
RUN(构建镜像过程中运行的命令)
    RUN        yum install openssh-server 
    RUN        ["mysqld","--basedir=/usr/local/mysql"](非shell命令,带参数) 
EXPOSE(向外暴露的端口) 
    EXPOSE  22    
CMD(启动容器时运行的命令)
    CMD     ["/usr/sbin/sshd","-D"]
COPY(拷贝文件或目录,支持通配符,若复制目录,只拷贝目录下是所有,cp data/*)
    COPY    init.sh     /tmp 
ADD(类似COPY,增加自动解压tar包tar.*,支持源文件url地址,但不自动解压tar包)
    ADD     bbs.tar.gz /var/www/html/
    ADD     https://mirrors.aliyun.com/repo/Centos-7.repo   /tmp
VOLUME (挂载容器目录到宿主机,不常用)
    VOLUME  ["/var/www/html","/data/mysql/data"] 
WORKDIR(类似cd命令,不常用)
ENV(设定变量) 
    ENV     CODEDIR   /var/www/html/
    ENV     DATADIR   /data/mysql/data
    ADD     bbs.tar.gz   ${CODEDIR}
    VOLUME  ["${CODEDIR}","${DATADIR}"]
ENTRYPOINT(容器启动时执行的命令,无法被替换,当成参数,只能写一条)
    ENTRYPOINT  ["/bin/bash","/init.sh"]
    # docker run -d 0cd2q /bin/bash        #bash无法替换ENTRYPOINT
    CMD         ["/bin/bash","/init.sh"]
    # docker run -d 0cd2q /bin/bash        #bash会替换CMD执行的命令,容器不能启动

2、dockfile文件
# vim /data/dockfile(文件名必须是dockerfile或Dockerfile)
  FROM centos:7.7
  RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm && yum -y install nginx
  ADD index.html /usr/share/nginx/html/index.html
  RUN echo "daemon off;" >> /etc/nginx/nginx.conf
  EXPOSE 80
  CMD ["nginx"]

3、构建dockerfile镜像
# docker image build -t "nginx:v1"  /data/dockfile
在执行脚本时,每一行会创建一个临时容器,代码越少越好,若执行错误,用临时容器调试
# docker rmi $(docker image ls -a | grep "none" | awk '{print $3}')  #删除所有临时容器 

 八、docker仓库(私有registry)

1、启动registry
# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry

2、修改配置文件
# vim /etc/docker/daemon.json 
  {
    "registry-mirrors": ["http://hub-mirror.c.163.com"],
     "insecure-registries": ["10.0.0.100:5000"]
  }
# systemctl  restart docker

3、上传到仓库
# docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1      #修改标签(格式: 仓库地址+项目名+镜像名)
# docker push 10.0.0.100:5000/oldguo/nginx:v1           #上传镜像

4、测试
# docker pull  10.0.0.100:5000/oldguo/nginx:v1          #下载私有仓库镜像

5、仓库加安全认证
1) 生成密码
# yum install httpd-tools -y
# htpasswd  -Bbn test 123 > /data/pw/test_passwd
2) 启动认证的容器
# docker rm -f `docker ps -aq`
# docker run -d -p 5000:5000 -v /data/pw/:/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 
3) 测试
# docker login 10.0.0.100:5000                          #登录

6、重启docker服务,容器退出的解决办法
方法一(推荐)
# docker run  --restart=always
方法二(覆盖全部容器)
# vim /etc/docker/daemon.json
  {
    "live-restore": true
  }

九、docker仓库(图形化仓库habor)

1、安装
1) 安装docker和docker-compose
# yum install -y docker-compose 
2) 下载安装包
  www.googleapis.com
3) 解压
# tar xf harbor-offline-installer-v1.9.0.tgz
4) 修改配置文件
# vim harbor.cfg
  hostname = 10.0.0.100
  harbor_admin_password = 123456
5) 安装Harbor 
# ./install.sh

2、客户端配置
# vim /etc/docker/demon.json
  {
    "insecure-registries": ["10.0.0.100"]
  }
# systemctl restart docker

3、在habor中添加项目
项目-----新建项目-----填写项目名----权限设置公开

4、上传到habor
# docker tag centos:6.9   10.0.0.100/tom/centos:v1      #打标签(路径+镜像及版本)
# docker login 10.0.0.100
# docker push  10.0.0.100/tom/centos:v1                 #上传到habor

5、登录web查看并测试
# docker pull  10.0.0.100/tom/centos:v1                 #客户端下载测试

十、Docker的网络类型

1、本地网络
1) 查看支持网络类型
# docker network ls                                     
2) 各类网络类型介绍
none:       无网络模式
bridge:     NAT模式(默认模式,通过iptables)
host:       使用宿主机的IP和端口(Namespace)
container:  共享指定容器的IP和端口(Namespace)
3) 使用网络启动容器
# docker run -it --network=host centos6.9 /bin/bash     

2、Docker跨主机网络(macvlan)
1) 介绍
macvlan: 网卡虚拟化多个mac地址,通过vlan技术实现跨主机通信,macvlan的地址只能人工管理,容易出现ip地址冲突
# docker rm $(docker ps -q -f status=exited)            #删除停止的容器
2) 创建macvlan网络(docker01和docker02)                       
# docker network create --driver macvlan --subnet 10.0.1.0/24 --gateway 10.0.1.254 -o parent=eth0 macvlan_1
# ip link set eth0 promsic on                           #设置eth0网卡为混杂模式(ubuntu或其他版本需要)
3) 创建macvlan网络的容器(docker01)
# docker run -it --network macvlan_1 --ip=10.0.0.11 busybox /bin/bash
4) 创建macvlan网络的容器(docker02)
# docker run -it --network macvlan_1 --ip=10.0.0.12 busybox /bin/bash
5) 测试
# ping 10.0.0.12

3、Docker 跨主机访问(overlay)
1)启动 consul 服务,实现网络的统一配置管理(docker01)
# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
2) 修改配置文件(docker01)
# 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",        #consul服务端IP和端口
    "cluster-advertise": "10.0.0.100:2376"              #本地docker的IP和端口
  }
# systemctl daemon-reload 
# systemctl restart docker
3) 修改配置文件(docker02)
# 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.101:2376"
  }
# systemctl daemon-reload 
# systemctl restart docker
4) 新版本要修改
# vim /usr/lib/systemd/system/docker.service
 ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://10.0.0.100:8500 --cluster-advertise=10.0.0.100:2376 
5) 创建overlay网络(docker01执行,docker02不用执行)
# docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254  overlay
6) 查看overlay网络(docker02)
# docker network ls
也可以登录web界面查看(10.0.0.100:8500)
7) 启动容器(docker01)
# docker run -it --network overlay busybox /bin/sh
8) 启动容器(docker02)
# docker run -it --network overlay busybox /bin/sh
9) 测试
# ping 172.16.0.1
# ping 172.18.0.2
# ping 172.18.0.3
备注: 每个容器有两个网卡,eth0实现容器间的通讯,eth1实现容器访问外网

 十一、Docker 单机编排

1、安装
# yum install python-devel -y
# pip install docker-compose

2、编写docker-compose.yml文件
示例1:
# vim docker-compose.yml
  web1:                              #ID
    image: nginx                     #使用镜像
    volumes:                         #把宿主机/opt/index1.html文件挂载到容器里
      - /opt/index1.html:/usr/share/nginx/html/index.html 
    expose:                          #容器内使用端口
      - 80
   
  web2:
    image: nginx
    volumes:
      - /opt/index2.html:/usr/share/nginx/html/index.html
    expose:
      - 80
   
  haproxy:
    image: haproxy
    volumes:
      - /opt/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    links:                           #依赖于web1和web2,只要这两个容器正常启动,haproxy才会启动
      - web1
      - web2
    ports:
      - "7777:1080"                  #端口映射,宿主机7777映射到容器1080端口
      - "80:80"
示例2:
# vim docker-compose.yml
  version: '3'
  services:
     db:
       image: mysql:5.7
       volumes:
         - db_data:/var/lib/mysql
       restart: always
       environment:
         MYSQL_ROOT_PASSWORD: somewordpress
         MYSQL_DATABASE: wordpress
         MYSQL_USER: wordpress
         MYSQL_PASSWORD: wordpress
wordpress: depends_on:
- db image: wordpress:latest volumes: - web_data:/var/www/html ports: - "80:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data: web_data: 3、启动和停止编排容器 # docker-compose -f docker-compose.yml up #-f指定文件,up启动 # docker-compose -d -f docker-compose.yml up #-d后台运行(生产环境加-d) # docker-compose -f docker-compose.yml stop #停止容器,不删除 # docker-compose -f docker-compose.yml down #停止容器,并删除

 

posted on 2020-10-30 17:06  五光十色  阅读(437)  评论(0编辑  收藏  举报

导航