优势
节约成本
安全
灵活
虚拟化缺点
性能降低
影响面较广
配置复杂
建设成本较高
yum install docker -y
systemctl start docker
docker --version
docker run hello-world
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker search centos 搜索
docker pull centos 下载
docker images 查看镜像
[root@node1 ~]# docker run -itd --name test1 5d0d /bin/bash
i 交互式创建
t 创建一个伪终端
d 后台执行
--name 指定名称
/bin/bash 执行的命令
[root@node1 ~]# docker ps 查看当前启动的容器
[root@node1 ~]# docker ps -a 查看所有容器
[root@node1 ~]# docker stop test1 停止
[root@node1 ~]# docker start test1 启动
[root@node1 ~]# docker restart test1 重启
[root@node1 ~]# docker rm 1997 删除
###不能直接删除一个运行中的容器,需要先停止或者使用-f
[root@node1 ~]# docker exec -it test1 /bin/bash 进入容器
exit 退出容器
[root@node1 ~]# docker run -itd --name nginx1 -p 801:80 nginx 将80端口影射本地801
进入nginx调整页面
[root@node1 ~]# docker exec -it nginx1 /bin/bash
root@645c33a0ed02:/# cd /usr/share/nginx/html/
root@645c33a0ed02:/usr/share/nginx/html# echo "test" > index.html
将本地的目录与容器的目录关联
[root@node1 nginx-web]# docker run -itd --name nginx2 -p 802:80 -v /root/nginx-web/:/usr/share/nginx/html/ nginx
拷贝文件到容器中的制定位置(目录需要使用 -r docker cp -r)
[root@node1 nginx-web]# docker cp /root/nginx-web/index.html nginx1:/usr/share/nginx/html/index.html
[root@node1 nginx-web]# curl localhost:801
hello
[root@node1 nginx-web]# cat /root/nginx-web/index.html
hello
docker kill name/ID 杀死容器
#mkdir testdocker
#cd testdocker/
#vim httpd-run.sh
#!/bin/bash
rm -fr /run/httpd/*
exec /usr/sbin/httpd -DFOREGROUND
#vim index.html
hello welcome
#vim dockerfile
FROM docker.io/noxiii/centos-yum
MAINTAINER "gongjunhe@localhost"
ADD httpd-run.sh /httpd-run.sh
ADD index.html /var/www/html/index.html
RUN rpm --rebuilddb && yum -y install httpd && chmod -v +x /httpd-run.sh
EXPOSE 80
WORKDIR /
CMD ["/bin/bash","httpd-run.sh"]
#docker build -t centos-yum:apache .
#docker run -itd --name centosapache -p 8080:80 centos-yum:apache
#docker ps
#curl localhost:8080
hello welcome
[root@node1 ~]# docker pull docker.io/noxiii/centos-yum
[root@node1 ~]# docker run -itd --name test2 0620 /bin/bash
[root@node1 ~]# docker exec -it test2 /bin/bash
宿主机
[root@node1 ~]# yum install httpd -y
[root@node1 ~]# mount /dev/cdrom /var/www/html/
[root@node1 ~]# systemctl start httpd
http://localhost/Packages/
[root@node1 ~]# docker inspect test2 查看IP地址
容器主机
生成server.repo文件 地址使用http://172.17.0.1
yum install vim samba* -y
docker commit 容器ID 镜像名称:标签
-m 定义描述信息
-a 定义作者
[root@node1 ~]# docker commit test2 centos:samba
[root@node1 ~]# docker images
保存到本地
[root@node1 ~]# docker save -o /root/centos-smb.tar centos:samba
查看当前容器状态,与image发生哪些变化
docker diff 容器名
A add
D del
C change
###当容器内数据发生改变时
docker load -i *.tar 导入
dockerfile
FROM 基础镜像 第一个指令必须是FROM
MAINTAINER 作者
RUN ["可执行文件","参数1","参数2"]
RUN ["./test","a","b"]
RUN ./test a b \
ADD src dst 将指定的src复制到dst中
ADD test1.txt /mydata/
ADD test2 test2
ADD a.tar /mytar
COPY
--chown=username:groupname src dst
COPY hom* /mydata/
COPY h?me.txt /mydata/
dst 自动创建
差异 copy不支持自动解压缩也不支持从网络获取文件
VOLUME ["/data"] 创建一个可以从本地主机或者其它容器mount的位置
WORKDIR /path/ 为RUN、CMD指定工作目录
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd /a/b/c
USER username:groupname 运行容器的用户
CMD
CMD ["可执行文件","选项1","选项2"]
CMD 可执行 选项1 选项2
只能有一条,如果有多个,最后一条生效
如果用户在启动容器的时候指定了运行的命令,会覆盖掉CMD的内容
RUN 在docker build
CMD docker run
ENTRYPOINT 在执行docker run时 此字段指定的工作不会被覆盖,除非--entrypoint,如果多个,最后一条生效
EXPOSE 监听的端口
三台主机
node1=192.168.1.3/24 管理&工作
node2=192.168.1.4/24 工作
node3=192.168.1.5/24 工作
1、selinux 防火墙
2、设置NTP保证时间同步
[root@node1 ~]# vim /etc /ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@node1 ~]# systemctl start ntpd
node2&node3同步时间
[root@node2 ~]# ntpdate 192.168.1.3
[root@node2 ~]# systemctl stop ntpd
[root@node3 ~]# ntpdate 192.168.1.3
[root@node3 ~]# systemctl stop ntpd
修改主机名
[root@node1 ~]# hostnamectl set-hostname node1
[root@node2 ~]# hostnamectl set-hostname node2
[root@node3 ~]# hostnamectl set-hostname node3
确保主机之间可以使用主机名进行访问
[root@node1 ~]# vim /etc/hosts
192.168.1.3 node1
192.168.1.4 node2
192.168.1.5 node3
#ping主机名,确保连通
生成ssh密钥,并拷贝到所有主机上
[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id root@node1
[root@node1 ~]# ssh-copy-id root@node2
[root@node1 ~]# ssh-copy-id root@node3
#拷贝完成之后测试下
组建swarm集群
[root@node1 ~]# docker swarm init --advertise-addr 192.168.1.3
将node2和node3加入
[root@node2 ~]# docker swarm join \
--token SWMTKN-1-041tdukoexnav5f6ejr0z5ignzxpzoec3jkbeyaskhzki5mp73-a8eqtnf5himr3j1pco0gqrf1v \
192.168.1.3:2377
[root@node3 ~]# docker swarm join \
> --token SWMTKN-1-041tdukoexnav5f6ejr0z5ignzxpzoec3jkbeyaskhzki5mp73-a8eqtnf5himr3j1pco0gqrf1v \
> 192.168.1.3:2377
可在管理节点查看到工作节点
[root@node1 ~]# docker node ls
创建私有仓库
调整内核参数
关闭MTU限制&开转发
[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@node1 ~]# sysctl -p
[root@node1 ~]# scp /etc/sysctl.conf node2:/etc/
[root@node1 ~]# scp /etc/sysctl.conf node3:/etc/
[root@node2 ~]# sysctl -p
[root@node3 ~]# sysctl -p
导入仓库镜像
[root@node1 ~]# docker load -i registry2.tar
创建存放私有镜像的目录
[root@node1 ~]# mkdir -p /opt/data/registry
启动容器
[root@node1 ~]# docker run -itd -p 5000:5000 --restart=always -v /opt/data/registry/:/var/lib/registry --name registry docker.io/registry
[root@node1 ~]# curl 192.168.1.3:5000/v2/_catalog
{"repositories":[]}
调整docker启动文件
[root@node1 ~]# vim /usr/lib/systemd/system/docker.service
$REGISTRIES \
--insecure-registry 192.168.1.3:5000
ExecReload=/bin/kill -s HUP $MAINPID
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker
[root@node1 ~]# scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/
[root@node1 ~]# scp /usr/lib/systemd/system/docker.service node3:/usr/lib/systemd/system/
向私有仓库上传镜像
加载nginx
[root@node1 ~]# docker load -i nginx.tar
[root@node1 ~]# docker tag nginx 192.168.1.3:5000/nginx 打标签
上传
[root@node1 ~]# docker push 192.168.1.3:5000/nginx
创建专用网络
[root@node1 ~]# docker network create --driver overlay hello
部署图形化工具
[root@node1 ~]# docker load -i visualizer.tar
[root@node1 ~]# docker tag docker.io/dockersamples/visualizer 192.168.1.3:5000/visualizer
[root@node1 ~]# docker push 192.168.1.3:5000/visualizer
启动
[root@node1 ~]# docker run -itd -p 8888:8080 -e HOST=192.168.1.3 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer 192.168.1.3:5000/visualizer
开启容器集群
[root@node1 ~]# docker service create --replicas 4 --network hello --name nginxweb -p 80:80 192.168.1.3:5000/nginx
查看数量
[root@node1 ~]# docker service ps nginxweb
改变节点数量
[root@node1 ~]# docker service scale nginxweb=12
删除
[root@node1 ~]# docker service rm nginxweb