一 安装
1 yum源准备
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r
3 安装docker-ce
安装最新版本
yum install -y docker-ce
安装指定版本(推荐,当docker命找不到时,重装一遍就可以,不用卸载)
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
4 启动Docker服务
systemctl daemon-reload
systemctl restart docker
docker version
docker info
5 配置镜像加速
阿里云Docker-hub
https://cr.console.aliyun.com/cn-hangzhou/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload systemctl restart docker 或者:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
docker配置文件目录
vim /usr/lib/systemd/system/docker.service
二 Docker的镜像基础管理
1 基础镜像拉取
docker search centos
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx
2 镜像基本查看
docker image ls
docker image ls --no-trunc --no-trunc可以看command详情
docker image ls -a -q 查看所有镜像ID
3 镜像详细信息查看
[root@docker /]# docker image inspect ubuntu:latest
[root@docker /]# docker image inspect 82f3b5f3c58f
4 镜像的导入和导出
[root@docker ~]# docker image save 3556258649b2 >/tmp/ubu.tar
[root@docker ~]# docker image rm 3556258649b2
[root@docker ~]# docker image load -i /tmp/ubu.tar
[root@docker ~]# docker image tag 3556258649b2 tangbin/ubu:v1
导入镜像后可能会出现REPOSITORY和TAG均为none的镜像,修改方式如下
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
[root@docker ~]# docker tag 231d40e811cd nginx:latest
5 镜像的删除
[root@docker ~]# docker image rm -f 3556258649b2
[root@docker ~]# docker image rm -f `docker image ls -q`
三 容器的管理
1 容器查看
docker container ls
docker container ls -a -q //查看所有容器ID
docker ps -a -q //查看所有容器ID
docker container ls -a --no-trunc //查看command信息
docker container inspect 58c78eab31b9 //查看详细信息
docker top 10424cfc4132 //查看容器资源占用
docker container top 10424cfc4132 //查看容器资源占用
docker container logs 10424cfc4132 //查看容器服务日志
docker container logs -tf 10424cfc4132 //查看容器服务日志,t时间,f为tail -f模式
docker container logs -f 10424cfc4132 //查看容器服务日志,t时间,f为tail -f模式
docker container logs -tf --tail 2 c4e0b5ce07c6 //查看最后两行
2 容器运行
交互式启动容器
docker container run -it 9f38484d220f
docker container run -it --name="centos6.9" 9f38484d220f
启动故障排查
docker container start -i
守护式容器
docker run -d --name="tangbin_nginx" nginx:1.14
docker container inspect tangbin_nginx 查询容器的详细信息
容器的应用场景
交互式的容器: 工具类: 开发,测试,临时性的任务(退出时自动关闭容器)
[root@docker ~]# docker container run -it --name="tangbin_cent76" --rm 9f38484d220f
守护式容器: 网络服务
[root@docker /]# docker run -d -p 8080:80 --name="tangbin_nginx_80" nginx:1.14
3 容器的启动\关闭\连接
守护式容器的关闭和启动
[root@docker /]# docker container stop tangbin_nginx_80
[root@docker /]# docker container start tangbin_nginx_80
交互式的容器的关闭和启动
[root@docker /]# docker container stop nervous_allen
[root@docker /]# docker container start -i nervous_allen
容器的连接方法(后台启动后,没退出时使用):
[root@docker /]# docker container attach nervous_allen
子进程的方式登录(在已有工作容器中生成子进程,做登录.可以用于进行容器的调试,退出时也不会影响到当前容器)
[root@docker ~]# docker container exec -it n2 /bin/bash
批量清除容器
docker container rm -f `docker container ls -a -q`
重启docker服务,容器全部退出的解决办法
方法1:添加 --restart=always
docker run -d -p 8080:80 --restart=always --name="tangbin_nginx_80" nginx:1.14
方法2: 在配置文件里添加"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
.....
......
"live-restore": true
}
4 容器切换
docker container exec -it n1 /bin/bash //登录守护试容器前台(如nginx),ctrl+D退出时也不影响。
ctrl + P Q //让容器的后台及前台运行,交互式容器ctrl+D退出会关闭容器。
docker container attach 容器名称或容器id //进入到容器前台,不适合nginx守护试容器。
5 容器运行时网络映射
docker run -d -p 80:80 --name="n1" nginx:1.14 //对外所有主机可以访问,映射8080端口。 *****
docker run -d -p 192.168.67.18:8081:80 --name="n3" nginx:1.14 //对外指定主机,映射8081端口。*****
docker run -d -p 80 --name="n4" nginx:1.14 //对外所有主机可以访问,随机映射端口32768-60999。
docker run -d -p 192.168.67.18::80 --name="n5" nginx:1.14 //对外指定主机,映射随机端口32768-60999。
docker run -d -p 8082:80 -p 8083:443 --name="n6" nginx:1.14 //所有主机,多端口映射。
docker run -d -p 80:80 -v /opt/html:/usr/share/nginx/html --name="n1" nginx //端口映射,目录映射,容器和本地目录共享。/opt/html为本地目录,/usr/share/nginx/html为容器目录
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(随机端口:32768-60999)
-p hostPort:containerPort/udp
-p 81:80 –p 443:443
三 数据卷使用
1 手工交互数据
docker container cp index.html n3:/usr/share/nginx/html/ 把本地的文件拷贝到容器
docker container cp n3:/usr/share/nginx/html/50x.html ./ 把容器文件拷贝到本地
2 Volume实现宿主机和容器的数据共享
开启两个nginx容器(80,81),共同挂载一个数据卷,实现数据持久化静态资源共享。
作用:数据持久化存储,如果不持久化,容器摧毁时,数据会丢失。
docker run -d -p 80:80 -v /opt/html:/usr/share/nginx/html --name="n1" nginx
docker run -d -p 81:80 -v /opt/html:/usr/share/nginx/html --name="n2" nginx
3 数据卷容器
作用: 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数卷容器进行统一管理
(1)宿主机模拟数据目录
mkdir -p /opt/Volume/a
mkdir -p /opt/Volume/b
touch /opt/Volume/a/a.txt
touch /opt/Volume/b/b.txt
(2)启动数据卷容器
docker run -it --name "nginx_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos:7.5.1804 /bin/bash
ctrl p q (交互式运行容器,用ctrl+D会关闭容器)
(3)使用数据卷容器
参数--volumes-from 使用哪个数据卷(第2步数据卷的名称)
docker run -d -p 8085:80 --volumes-from nginx_volumes --name "n8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "n8086" nginx
[root@docker01 ~]# docker run -d -p 8085:80 --volumes-from nginx_volumes --name "n8085" nginx
1bc2051db0ba921c454d4dd1e10cfd250027b8ab29172c64f99b88c2d0327068
[root@docker01 ~]# docker run -d -p 8086:80 --volumes-from nginx_volumes --name "n8086" nginx
3227e4c3ecc84176cb91941a786585476dd17e8039e5d92a61dac740df272f04
[root@docker01 ~]# docker container exec -it n8085 /bin/bash
root@1bc2051db0ba:/# ls /opt/
a b
root@1bc2051db0ba:/# ls /opt/a
a.txt c.txt
(4)查看容器挂载路径
docker container inspect nginx_volumes
四 本地yum源配置
制作本地局域网yum源
1 安装vsftpd软件
yum install -y vsftpd
2 启动ftp
systemctl enable vsftpd
systemctl start vsftpd
3 上传系统进行到虚拟机
略.
4 配置yum仓库
mkdir -p /var/ftp/centos6.9
mkdir -p /var/ftp/centos7.5
[root@docker mnt]# mount -o loop /mnt/centOS-6.9-x86_64-bin-DVD1.iso /var/ftp/centos6.9/
[root@docker mnt]# mount -o loop /mnt/centos-7-x86_64-dvd-1804.iso /var/ftp/centos7.5/
windows验证 ftp://192.168.67.18/centos6.9/
在容器操作,把/etc/yum.repos.d目录下的删除,重新构建新的yum源。
cat >/etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enabled=1
gpgcheck=0
EOF
cat >/etc/yum.repos.d/ftp_7.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos7.5
enabled=1
gpgcheck=0
EOF
在容器操作
yum clean all
yum makecache
yum install -y openssh*
yum install -y openssh-server
/etc/init.d/sshd start //启动ssh ,centos6.9系统,centos7.5是另一种方式
passwd 设置密码123456
ifconfig 看ip
用主机连接 ssh 172.17.0.2 用主机制作镜像 docker commit centos6.9 tangbin0505/centos6.9_sshd:v1 启动容器时,通过前台启动ssh,不需要手工启动(这时进去不了容器) docker run -d --name="sshd" f3cacf803d1c镜像ID /usr/sbin/sshd -D docker container inspect 9620f5bb9922(容器ID) 查看容器ip 通过映射端口启动 docker run -d --name="sshd_2222" -p 2222:22 f4ee78227dad /usr/sbin/sshd -D 然后通过xshell5 连接 192.168.67.18 端口2222 账号root 密码123456 如果启动多个进程服务,需要写脚本
[root@docker html]# cat init.sh
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
docker container run -d --name="oldguoyun_lamp_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 22222:22 -p 8888:80 -p 33060:3306 ac8888ea3e21 /var/www/html/init.sh
五 镜像制作
镜像的制作
docker commit centos6.9 tangbin0505/centos6.9_sshd:v1
基于新镜像启动容器实现,centos6.9+sshd的功能
docker run -d --name="sshd_2222" -p 2222:22 f4ee78227dad /usr/sbin/sshd -D
centos6.9+sshd
启动基础镜像容器
docker run -it --name="oldguo_centos" centos:6.9
安装所需要的软件包 ,并且启动测试
mv /etc/yum.repos.d/*.repo /tmp
echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
yum makecache fast && yum install openssh-server -y
/etc/init.d/sshd start ----->重要:ssh第一次启动时,需要生成秘钥,生成pam验证配置文件
/etc/init.d/sshd stop
echo "123456" | passwd --stdin
centos7.5+sshd
mv /etc/yum.repos.d/*.repo /tmp
echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos7.5\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
yum makecache fast && yum install openssh-server -y
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
六 Docker构建私有registry(端口5000)
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": ["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.67.18:5000"]
}
3 重启
systemctl restart docker
4 制作本地镜像并push
[root@docker ~]# docker tag nginx 192.168.67.18:5000/oldguo/nginx:v1 [root@docker ~]# docker images [root@docker ~]# docker push 192.168.67.18:5000/oldguo/nginx:v1
5 异地进行pull镜像
docker pull 10.0.0.100:5000/oldguo/nginx:v1
6 本地仓库加安全认证
生成密码:
yum install httpd-tools -y
mkdir /opt/registry-auth/ -p
htpasswd -Bbn ben 123 > /opt/registry-auth/htpasswd
7 重新启动带有秘钥功能的registry容器
docker rm -f `docker ps -aq`
docker run -d -p 5000:5000 -v /opt/registry-auth/:/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
8 push镜像,需要进行login
[root@oldboy ~]# docker login 10.0.0.100:5000
Username: ben
Password:
七 重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always 方法二:"live-restore": true docker server配置文件/etc/docker/daemon.json参考 { ..... ...... "live-restore": true }
八 docker-habor实现图形化镜像仓库
1 安装docker和docker-compose
yum install -y docker-compose
2 下载harbor-offline-installer-vxxx.tgz 3 上传到/opt,并解压 4 修改harbor.cfg配置文件
hostname = 192.168.67.18
harbor_admin_password = 123456
5 执行install.sh
[root@docker01 harbor]# ./prepare
[root@docker01 harbor]# ./install.sh
6 修改配置文件
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.67.18:5000","192.168.67.18"],
"live-restore": true
}
7 重启
systemctl restart docker
8 登录habor添加项目
参考https://blog.csdn.net/zyl290760647/article/details/83752877
9 制作镜像并上传habor
[root@docker harbor]# docker tag centos:6.9 192.168.67.18/tangbin/centos:v1
[root@docker harbor]# docker login 192.168.67.18
[root@docker harbor]# docker push 192.168.67.18/tangbin/centos:v1
10 在节点中pull habor中的镜像
docker pull 192.168.67.18/tangbin/centos:v1
11 设置harbor开机自启动
查看目录find / -name harbor: /opt/harbor
查看docker-compose路径:which docker-compose
新建文件,制作systemd服务
vim /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /opt/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /opt/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
保存退出
设置开机启动
systemctl enable harbor
systemctl start harbor
八 docker-网络模型
1 查看支持网络类型
docker network ls
2 测试使用各类网络类型
docker run network=xxx
none : 无网络模式
bridge : 默认模式,相当于NAT
host : 公用宿主机Network NameSapce
container:与其他容器公用Network Namespace
3 Docker跨主机访问-macvlan实现
docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=eth0 macvlan_1
ip link set eth0 promsic on (ubuntu或其他版本需要)
[root@docker ~]# docker run -it --network macvlan_1 --ip=10.0.0.11 oldguo/centos6.9-sshd:v1.0 /bin/bash
[root@docker ~]# docker run -it --network macvlan_1 --ip=10.0.0.12 centos:6.9 /bin/bash
4 Docker 跨主机访问-overlay实现
(1)启动 consul 服务,实现网络的统一配置管理(只需在docker01装consul)
consul:kv类型的存储数据库(key:value)
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
在docker01、02上配置(低版本17.03)
vim /etc/docker/daemon.json 版本17.03
vim /lib/systemd/system/docker.service 新版本
vim /etc/sysconfig/docker 版本Docker version 1.12.6
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.67.18:5000","192.168.67.18"],
"live-restore": true,
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://192.168.67.18:8500",
"cluster-advertise": "192.168.67.18:2376"
}
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.67.18:5000","192.168.67.18"],
"live-restore": true,
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://192.168.67.18:8500",
"cluster-advertise": "192.168.67.18:2376"
}
修改配置文件(高版本需要改这个,17.03版本按上述改)
vim /usr/lib/systemd/system/docker.service 在ExecStart这行改
ExecStart=/usr/bin/dockerd daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.67.18:8500 --cluster-advertise=192.168.67.18:2376
--cluster-store 指向 consul 服务节点
--cluster-advertise 指向本机提供服务的 IP/网卡:端口
重启
systemctl daemon-reload
systemctl restart docker
(2)创建overlay网络
参考官网 https://docs.docker.com/engine/reference/commandline/network_create/#specify-advanced-options
参考 https://blog.csdn.net/weixin_33860147/article/details/91767148
先检查consul 容器有没启动,没启动的话,就先执行启动(这里的consul容器ID为974f970ded62) docker container start 974f970ded62 docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 overlay 查看网络驱动 docker network ls
(3)两边启动容器测试
docker run -it --network overlay busybox /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
九 k8s安装部署
待续
(1)同步集群状态
Etcd 轻量级K-V 还有自动发现功能,有集群
Zookeeper 重量级,淘宝有用,有集群
Consul 网络集群,K-V
(2)服务发现 Etcd Haproxy
(3)日志监控 ELK stack ,Prometheus