一、Docker快速入门
Docker 改变了什么?
1.简化配置 2.流水线管理 3.应用隔离 4.提高开发效率 5.快速部署 6.面向产品:产品交付 7.面向开发:简化环境配置 8.面向测试:多版本测试 9.面向运维:环境一致性 10.面向架构:自动化扩容(微服务)
1、安装、启动
1、配置yum源 http://mirrors.aliyun.com/centos/7/extras/x86_64/ http://mirrors.aliyun.com/centos/7/os/x86_64/ http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/ 2、安装 yum install docker-ce -y 3、启动 systemctl start docker
2、配置远程访问和第三方仓库
1、修改配置脚本
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd
2、配置启动参数(默认daemon文件没有)
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"data-root": "/opt/docker",
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] }
配置daemon文件参数,不能和docker.service文件里ExecStart一致,否则会冲突。
3、重载配置并重启 systemctl daemon‐reload systemctl docker restart docker daemon ‐‐help 这里可以查看到所有支持的参数
3、简单操作
ctrl+PQ 保存容器退出 #帮助 docker --hlep docker deamon --help #查看镜像 docker images #查看镜像环境 docker image inspect xxx #搜索镜像 docker search centos #下载镜像 docker pull docker.io/centos #导出镜像 docker save centeos >/tmp/centos.tar.gz #导入镜像 docker load --input centos.tar docker load centos.tar #删除镜像 docker rmi 镜像ID(IMAGE ID) #删除容器 docker rm mydocker docker rm -f mydocker(删除正在运行的容器) docker run --rm centos /bin/echo "hehe" 运行后删除容器 #启动容器 docker run centos /bin/echo 'Hello world' docker start mydocker #显示镜像状态 docker ps -a #更改名称 docker run --name mydocker -t -i centos /bin/bash #后台运行容器 docker run -d -P nginx #查看容器访问日志 docker logs e6b599b46241 docker logs mydocker #查看容器映射的端口 docker port mydocker #数据卷 docker run -d --name test1 -v /data nginx docker inspect -f {{.Mounts}} mynginx ##查找上面方法,默认挂载的位置 -v src:dst #源:目的 -v src:dst:ro #加ro 为只读 #挂载单文件 -v srcfile:dstfile #源文件:目的文件 --volumes-from docker run -d --name test2 --volumes-from test1 cenos /bin/bash #数据卷容器。让此数据卷在多个容器之间共享,test1为已经挂载数据卷的容器名。 #结束正在运行的所有容器 docker kill $(docker ps -a -q) #删除所有容器 docker rm $(docker ps -a -q)
4、进入容器
方法1 docker attach mydocker(不安全,不推荐) 同时进入2次容器,一个窗口执行的命令,另个窗口可以看到,不安全。
方法2(执行命令返回结果) docker exec -it mydocker /bin/bash docker exec mydocker whoami
方法3(复杂)yum install -y util-linux
docker inspect --help nsenter --help
docker inspect -f "{{ .State.Pid}}" mydocker nsenter -t 3729 -m -u -i -n -p nsenter --target 3729 --mount --uts --ipc --net --pid
5、网络访问
随机映射 docker run -P 指定映射 -p 81:80 -p 443:443 docker run -d -p 192.168.1.253:81:80 nginx
6、容器间互联
方法1 docker --name web2 --link web1 -d -p 8080:80 mynginx nginx docker exec -it web2 sh cat /etc/hosts #查看 docker inspect web1 #查看容器信息
方法2 docker -d --name web2 --link web1:shop_web -p 8080:80 mynginx nginx cat /etc/hosts #查看 有变化,shop_web为别名
7、手动构建容器
1、在centos镜像基础上安装nginx docker run --name mynginx -it centos rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm yum install -y nginx vi /etc/nginx/nginx.conf daemon off; 2、保存镜像 docker commit -m "My-Nginx" 148aca4d9f2e oldboy/mynginx:v1 -m 描述信息 3、启动构建好的容器 docker run --name test1 -d -p 80:80 qinzc/mynginx:v1 nginx
8、自动构建容器
1、编写dockerfile vim /opt/dockerfile/nginx/Dockerfile #基础镜像 FROM centos #维护人的信息 MAINTAINER Zicheng.Qin 542129333@qq.com #安装执行 RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum -y install nginx && yum clean all RUN echo "daemon off;" >> /etc/nginx/nginx.conf #添加文件 ADD index.html /user/share/nginx/html/index.html #开放端口 EXPOSE 80 #容器执行命令 CMD ["nginx"] 2、开始构建 echo "nginx in docker,hahaha" > index.html docker build -t oldboy/mynginx:v2 /opt/dockerfile/nginx/ 3、启动 docker run --rm --name test -d -p 80:80 mynginx:v2
9、Docker网络
1)Docker 创建自定义网络
1、创建网络 docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 110.10.0.1 my_net
2、查看 docker network ls
3、验证测试指定IP dokcer run -it --rm --network=my_net --ip 10.10.0.88 nginx 4、给容器添加自定义的网段 docker network connect my_net 容器ID
默认网络
docker network ls NETWORK ID NAME DRIVER SCOPE a12599cda63c bridge bridge local e24ca1f8f76d host host local 2ab615faf494 none null local 默认带有3种网络驱动 bridge: NAT模式,默认使用 host : 会走物理网卡,只能起一个对应端口容器。相当于复制物理机IP来访问。 none : 容器内只有回环地址。需要API等配置。 案例:docker run -it --rm --net=host -p 80:80 centos bash
2)跨主机通信 (指定路由方法)
1、首先保证两台主机之间能正常通信。
2、更改Docker默认的网卡IP,使之间不同网段。
环境
第一台宿主机:(IP:192.168.1.100) 第二台宿主机:(IP:192.168.1.200) 进入容器,查看各自IP,ping对方容器IP看看是否畅通(一般不通) docker run -it --name node1 centos bash (容器1 IP:192.58.1.2) docker run -it --name node2 centos bash (容器2 IP:192.68.1.2)
配置静态路由
宿主机1上配置一条路由到宿主机2 (演示:临时生效) route add -net 192.158.1.0/24 gw 192.168.1.200
最后进入容器测试是否能ping宿主机2,到此主机间容器互联配置完毕
3)跨主机通信 (overlay)
sysctl vm.max_map_count=262144 docker pull sebp/elk
运行ELK容器
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --rm --name elk sebp/elk #容器启动后执行下面地址验证es是否启动成功 http://192.168.1.xx:9200/_search?pretty
安装fluentd软件(与elk容器安装同一台机)
docker pull fluent/fluentd #拉取软件 mkdir /fluentd_log #创建一个收集日志后保存的路径 docker run -d -p 24224:24224 -p 24224:24224/udp -v /fluentd_log:/fluentd/log fluent/fluentd
安装日志收集工具filebeat (与elk容器安装同一台机)
1、安装
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat rpm -ivh filebeat-6.x.x-x86_l4.rpm
2、配置
vim /etc/filebeat/filebeat.yml enabled:true #开启 paths: - /var/log/*.log #注释掉这行日志目录 - /data/docker/containers/*/*.log #注释,此目录为容器ID - /fluentd_log #添加这行 output.elasticsearch: hosts:["192.168.1.xx:9200"] #改成ES地址 3、启动 /etc/init.d/filebeat start #启动 filebeat /etc/init.d/filebeat status #查看 filebeat 状态
修改docker日志驱动,发送日志到fluentd软件
(要收集日志的 主机修改此文件) vim /etc/docker/daemon.json { "log-driver":“fluent”, "log-opts":{ "fluentd-address":"192.168.1.xx:24224", "tag":"linux-node4.xx.com" #标识,改成自己主机名 } } systemctl daemon-reload #重载配置 systemctl restart docker #记得关闭防火墙,selinux之类的。
容器时间同步方法
docker exec d2kldds23 mkdir /usr/share/zoneinfo -p docker cp /usr/share/zoneinfo/Asia d2kldds23:/usr/share/zoneinfo/Asia docker restart d2kldds23
11、Docker 单机编排入门
Docker-compose 容器编排
LNMP场景
LN: A容器 MYSQL: B容器 Redis: C容器
1、想启动A容器时,B容器必须先启动。
2、C容器要启动,B容器必须先启动。 实现方法,就是使用docker-compose单机编排工具 Docker-compose
环境准备
yum -y install python-pip pip install docker-compose #如果下载启动有问题可到gitbug下载二进制版本,chmod +x 给执行权限即可 https://github.com/docker/compose/releases
创建docker-compose.yml编排文件
web1: image: nginx volumes: - /root/docker/index1.html:/usr/share/nginx/html/index.html expose: - 80 web2: image: nginx volumes: - /root/docker/index2.html:/usr/share/nginx/html/index.html expose: - 80 haproxy: image: haproxy volumes: - /root/docker/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg links: - web1 - web2 ports: - "7777:1080" - "80:80"
启动编排
docker-compose up /root/docker/ocker-compose.yml
docker-compose -d up /root/docker/ocker-compose.yml #生产环境加-d参数,后台启动
haproxy.cfg
1)Harbor简介
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
2)下载和配置Harbor
环境说明
系统版本: CentOS7.x docker-ce: 18.03.1-ce docker-compose: version 1.22.0 Harbor: v1.7.0 安装方式: 在线安装 安装位置: /volume1/harbor
####安装Harbor需要先安装docker和docker-compose###
下载安装包
从 github harbor 官网 release 页面下载指定版本的安装包,因为是谷歌的地址,国内下载不了,饭墙下载后在传到服务器上即可。 #在线安装包 $ wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.0.tgz $ tar xvf harbor-online-installer-v1.7.0.tgz #离线安装包 https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.0-rc2.tgz
配置Harbor
解压缩之后,找到/volume1/harbor/harbor.cfg文件,该文件就是Harbor的配置文件。 vim /usr/local/harbor/harbor.cfg # hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost hostname = 192.168.1.11 # 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on ui_url_protocol = http # mysql数据库root用户默认密码root123,实际使用时修改下 db_password = root123 #邮箱根据情况配置,发送重置密码邮件时使用,也可以不配置 email_server = smtp.qinzc.me email_server_port = 25 email_username = admin@qinzc.me email_password = 12345678 email_from = admin <admin@qinzc.me> email_ssl = false #设置只有管理员可以创建项目 project_creation_restriction = adminonly # 启动Harbor后,管理员UI登录的密码,默认是Harbor12345 harbor_admin_password = Harbor12345 # 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证 auth_mode = db_auth # 是否开启自注册 self_registration = on # Token有效时间,默认30分钟 token_expiration = 30 # 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员) project_creation_restriction = everyone
3)安装Harbor
执行安装脚本 /volume1/harbor/install.sh 修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各个服务,Harbor依赖的镜像及启动服务如下: # docker images REPOSITORY TAG IMAGE ID CREATED SIZE goharbor/chartmuseum-photon v0.7.1-v1.7.0 666d74cc236a 2 weeks ago 111MB goharbor/harbor-migrator v1.7.0 482699d98927 2 weeks ago 799MB goharbor/redis-photon v1.7.0 8adff755797f 2 weeks ago 96.1MB goharbor/clair-photon v2.0.7-v1.7.0 7e72f6ba05bd 2 weeks ago 165MB goharbor/notary-server-photon v0.6.1-v1.7.0 b4a22960dfce 2 weeks ago 102MB goharbor/notary-signer-photon v0.6.1-v1.7.0 bb0db7ebd1de 2 weeks ago 99.6MB goharbor/harbor-registryctl v1.7.0 1906a8b84fa5 2 weeks ago 101MB goharbor/registry-photon v2.6.2-v1.7.0 677f21b09362 2 weeks ago 86.4MB goharbor/nginx-photon v1.7.0 6ed96fc73f83 2 weeks ago 35.5MB goharbor/harbor-log v1.7.0 722fa4a77846 2 weeks ago 81MB goharbor/harbor-jobservice v1.7.0 effd390c0cd4 2 weeks ago 83.8MB goharbor/harbor-core v1.7.0 2ebd58ce5638 2 weeks ago 95.2MB goharbor/harbor-portal v1.7.0 72a291f86bab 2 weeks ago 40.2MB goharbor/harbor-adminserver v1.7.0 9f850341a571 2 weeks ago 72MB goharbor/harbor-db v1.7.0 45d94fe5fee5 2 weeks ago 133MB microbox/dockerui latest c3452e32cfe9 3 years ago 10.4MB # docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------------------ harbor-adminserver /harbor/start.sh Restarting harbor-core /harbor/start.sh Up (health: starting) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:433->443/tcp, 0.0.0.0:4433->443/tcp, 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy) 启动完成后,访问刚设置的hostname设置的即可 进行管理http://192.168.1.11 ,可以修改docker-compose.yml文件更改对应服务的端口映射。 自此私有仓库搭建完毕。
4)客户端配置
因为docker 默认不支持http方式登陆,所以客户端要以http方式登陆,需修改下配置。 方法一: vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11 #增加镜像地址
方法二: 创建/etc/docker/daemon.json文件,在文件中指定仓库地址 "insecure-registries":["192.168.1.11"] 完成后从载配置,重启docker systemctl daemon-reload systemctl restart docker
5)测试上传和下载镜像
1.客户端登陆 docker login 192.168.1.11 Username (admin): Password: Login Succeeded
2.创建Dockerfile vim Dockerfile FROM centos:centos7.1.1503 ENV TZ "Asia/Shanghai"
3.创建镜像 docker build -t 192.168.1.11/library/centos7.1:0.1 /opt/
4.把镜像push到Harbor docker push 192.168.1.11/library/centos7.1:0.1 如果是从其他仓库pull下来的镜像,记得先执行 docker tag 给镜像做tag 才能push,例如: docker pull busybox docker tag busybox:latest 192.168.1.11/library/busybox:latest docker push 192.168.1.11/library/busybox:latest 格式如下: #docker tag 镜像 域名/项目名称/镜像名:版本 docker tag SOURCE_IMAGE[:TAG] 192.168.1.11/library/IMAGE[:TAG] # docker push 更改tag后的镜像名 docker push 192.168.1.11/library/IMAGE[:TAG]
5.登录web页面查看镜像 查看上传的镜像。 6.拉取上传到Harbor的镜像 docker pull 192.168.1.11/track/busybox:latest
13、Docker数据卷
数据卷的作用
1:持久化容器运行过程中产生的数据文件 2:实现多个容器间的文件共享。
容器数据持久化
1、数据卷:将本地磁盘文件或文件夹挂载到容器里 -v /dest -v src:dst [ro]|[rw] docker run -it --name mynginx1 -v /data/nginx:/etc/nginx/conf.d nginx
2、数据卷容器:将外部容器分享给容器 --volumes-from 数据卷容器专门用来挂载数据卷的容器,以供其他容器引用和使用
docker run -it --volumes-from mynginx1 --name mynginx2 nginx 3、数据卷管理命令 docker volume create 创建数据卷
docker volume ls 查看数据卷
docker volume inspect 查看数据卷的属性
docker volume rm 删除数据卷
一个容器的volume可以被多个容器同时共享,当容器被删除时,volume不会被自动删除,需要手动来删除。
关于Docker清理
ocker system df: 查看Docker的磁盘使用情况 docker images 列出docker镜像 docker ps 列出docker容器 docker volume ls 列出docker数据卷 docker network ls 列出docker网络 docker info 列出容器镜像的数量以及一些docker 安装等系统信息。 docker system prune 清除未使用的数据与进程,默认没有清除数据卷的功能 docker container prune 清除停止的容器; docker volume prune 清除未使用的数据卷; docker image prune 清除未使用的镜像; docker container rm $(docker container ls -a -q) / docker rm $(docker ps -a -q); 清除容器 docker image rm $(docker images ls -a -q); 清除镜像 docker volume rm $(docker volume ls -q); 清除数据卷 docker network rm $(docker network ls -q); 清除网络 docker rm $(docker ps -a -q) 删除所有已经停止的容器; docker rmi $(docker images -q -f dangling=true) 删除未打标签的镜像