学习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 #停止容器,并删除
QQ:328864113 微信:wuhg2008