一、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)

consul实现跨容器互通

需要用到配置管理中心consul,实现跨容器互通

准备环境

consul管理中心(IP:192.168.1.99)
docker pull progrium/consul
docker run -d -p 8500:8500 -name consul progrium/consul -server -bootstrap

第一台宿主机:(IP:192.168.1.100)
vim /etc/docker/daemon.json
增加:
{
"cluster-store":"consul:192.168.1.99:8500",
"cluster-advertise":"192.168.1.100:2375"
}
保存后:
systemctl daemon-reload #重载配置
systemctl restart docker #记得关闭防火墙,selinux之类的。

第二台宿主机:(IP:192.168.1.200)
vim /etc/docker/daemon.json
增加:
{
"cluster-store":"consul:192.168.1.99:8500",
"cluster-advertise":"192.168.1.200:2375"
}
保存后:
systemctl daemon-reload #重载配置
systemctl restart docker #记得关闭防火墙,selinux之类的。

开始配置

1.第一台宿主机:(IP:192.168.1.100)

创建网络:    
docker network create -d overlay my_net1 验证是网络否创建同步:
docker network ls,到第二台宿主机执行同样命令,看看my_net1网络是否同步过去。 运行容器
docker run -it --rm --network my_net1 nginx

2.第二台宿主机:(IP:192.168.1.200) 运行容器
docker run -it --rm --network my_net1 nginx

验证

进入容器,Ping对端容器IP,一般就可以通信了。

10、docker 日志收集

环境准备

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

global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096 defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms listen stats
bind 0.0.0.0:1080
mode http
stats enable
stats hide-version
stats uri /stats
stats auth admin:admin frontend balance
bind 0.0.0.0:80
default_backend web_backends backend web_backends
mode http
option forwardfor
balance roundrobin
server web1 web1:80 check
server web2 web2:80 check

 12、搭建Docker私有仓库(Harbor)

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) 删除未打标签的镜像

最新文章

  1. Android N开发 你需要知道的一切
  2. 创建Github远程仓库
  3. apache服务器安装
  4. Codeforces Round #364 (Div. 2) B. Cells Not Under Attack
  5. suds调用webservice
  6. html点击按钮 弹出 多选择窗口级联下拉复选
  7. Java常用jar包用途
  8. JSON,JSONP
  9. 手机GUI自动化测试介绍
  10. poj1160Post Office(DP)
  11. poj 1064 Cable master【浮点型二分查找】
  12. ASP.NET-FineUI开发实践-4(二)
  13. on IRC, how to use secure connection(SSL) and get a cloak/vhost to hide your IP
  14. Hibernate 中Hql 查询中间表的用法
  15. Windows转Linux总结(附带常用Linux命令-LinuxMint)
  16. sklearn—特征工程
  17. linux磁盘空间占满问题快速定位并解决
  18. 升级nginx 和nchan
  19. npm常规命令行集合
  20. Ribbon 负载均衡机制

热门文章

  1. 还在用Excel做数据分析?别人都在用数据分析工具啦!
  2. oj教程--学习顺序
  3. jvm添加jmx远程监控
  4. c# 窗体相关操作(最大化/最小化/关闭/标题栏)
  5. webstorm安装vue插件及安装过程出现的问题
  6. netty系列之:EventLoop,EventLoopGroup和netty的默认实现
  7. 目标检测常用库MMCV安装中遇到的问题总结
  8. 软件工程homework-003
  9. kali linux 更换国内源报GPG error解决办法
  10. Linux巡检检查项