1.docker安装
参考文档
https://docs.docker.com/engine/install/centos/
1.安装docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
2.国内源
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11uPj8mi
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
2.docker镜像 docker image
2.1 搜索拉取镜像
docker search centos
docker pull centos:7.5.1804
docker pull nginx
2.2 查询镜像
docker images
docker image ls 显示镜像 跟上面命令一样
docker image ls --no-trunc 查询镜像ID的详细信息
docker images -q 仅显示镜像ID
docker image ls -q 仅显示镜像ID 跟上面命令一样
docker inspect ID/name:tag 查询镜像详细信息
2.3 删除镜像
docker rmi ID
docker rmi `docker images -q`
2.4 导入导出镜像
docker image save nginx >/opt/nginx.tar.gz
docker image load -i /opt/nginx.tar.gz
docker [image] tag centos onlineyh:centos7.8 给centos 修改名字 tag
3.docker容器 docker container
3.1 docker 交互式启动
--name 指定名字
--rm 容器退出就自动销毁
-it 交互式
--privileged=true docker 应用容器 获取宿主机root权限(特殊权限-)
docker run -it --name "test" centos /bin/bash
docker run -it --name "test1" --rm centos /bin/bash 加--rm后容器退出就自动删除销毁
docker container ls -a 查看
docker ps -a 查看
docker ps -a -q 查看id
docker container rm test1
交互式启动容器 Ctrl+p+q 可以hold住
docker container attach NAME 调入到前台
3.2 docker守护式启动
docker run -d -p 80:80 --name "testnginx" nginx
docker run --name testnginx1 -d nginx /bin/sh -c "while true ;do echo hello world; sleep 1;done" 死循环
3.3 docker 端口
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
随机端口是从32768开始顺序向后
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(随机端口)
-p hostPort:containerPort/udp udp端口
-p 81:80 –p 443:443
随机映射
docker run -P 80(随机端口)
docker port nginx 查看容器映射的端口信息
3.4 docker 启动关闭
docker start/stop/restart/kill test 启动关闭重启
ctrl +d 退出
docker start -i test 启动后直接进入容器中
3.5 docker 进入容器
docker container attach testnginx 打开所有窗口一样的界面
docker container exec -it test /bin/bash 子进程的方式登录退出不影响当前容器
3.6 docker 容器内进程查看 日志查看 开机启动
docker ps -a -q -l
docker container -a -q 新命令跟上面一样
docker ps --no-trunc -a 以详细信息查看内容 默认会自动隐藏内容
docker top testxx 查看容器内的运行进程
docker inspect
docker attach 容器ID|容器名称(工具类)配合ctrl+p+q
docker exec -i -t 容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用
docker exec -it centos6.9 /bin/bash
docker logs testxx
docker logs -t testxx 根据时间查看日志
docker logs -tf testxx 查看实时动态的日志
docker logs -tf --tail 10 testxx 最后10行
docker logs -tf --tail 0 testxx
docker run -d -p 80:80 --restart=always --name "testnginx" nginx 添加到开机启动
docker update --restart=always testxx 添加开机启动 已运行的容器
4. docker 数据卷
4.1 docker container cp
docker run -d --name nginx -p 81:80 nginx
docker container cp index.html nginx:/usr/share/nginx/html/ 拷贝文件到容器内 容器删除 就不存在
4.2 docker container -v
docker run -d --name="nginx1" -P -v /data:/usr/share/nginx/html nginx
docker run -d --name="nginx2" -P -v /data:/usr/share/nginx/html nginx 两个容器同时挂载一个数据卷
4.3 docker container 容器卷
docker run -it --name "httpd_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos /bin/bash
如果宿主机文件不存在会自动创建
ctrl +p +q 使其不退出
touch /opt/Volume/{a,b}/test.txt
docker run -d -p 8085:80 --volumes-from httpd_volumes --name "http8085" nginx
docker run -d -p 8086:80 --volumes-from httpd_volumes --name "http8086" nginx
docker container exec -it http8086 /bin/bash 进入容器查看数据是否存在
4.4 容器手动制作
配置本地局域网yum源
mount /dev/cdrom /mnt cdrom挂载
mount -o loop CentOS-7-x86_64-DVD-2003.iso /mnt iso挂载
yum install nginx
vim /etc/nginx/conf.d/default.conf
location / {
root /mnt;
index index.html index.htm;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
charset utf-8,gbk;
}
systemctl start nginx
cat >>/etc/yum.repos.d/cdrom.repo <<EOF
[cdrom]
name=cdrom
baseurl=http://192.168.122.103
enabled=1
gpgcheck=0
EOF
4.4.1 例如:制作容器 具有ssh功能
https://registry.hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated
docker pull centos:7.9.2009 默认centos是8
mv /etc/yum.repo.d/*.repo /tmp
cat >>/etc/yum.repos.d/cdrom.repo <<EOF
[cdrom]
name=cdrom
baseurl=http://192.168.122.103
enabled=1
gpgcheck=0
EOF
docker run -it --name "centos_ssh" 8652b9f0cb4c 启动容器
yum install openssh-server -y 安装sshd服务端 附带openssh依赖安装
/usr/sbin/sshd -D & ssh启动报错
[1] 79
[root@690bd21dfe47 /]# Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
解决: ssh-keygen -A
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
修改sshd运行在前端
mkdir /var/run/sshd
sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
/usr/sbin/sshd -D & 启动
yum install lsof -y
lsof -i :22 查看端口是否容器中运行
echo "123456" | passwd root --stdin 添加密码
宿主机运行:
docker inspect centos_ssh 查看容器ip地址
ssh root@172.17.0.2 输入密码正常登陆
镜像制作 :
docker commit centos_ssh onlineyh/centos7.9_sshd:v1
镜像运行 映射端口
docker run -d -p 2222:22 --name=sshd onlineyh/centos7.9_sshd:v1 /usr/sbin/sshd -D
ssh 192.168.122.102 -p 2222 登陆正常
4.4.2 例如:制作容器 具有lamp功能
docker run -it --name "centos_lamp" -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html 8652b9f0cb4c 运行一个容器
mv /etc/yum.repo.d/*.repo /tmp
cat >>/etc/yum.repos.d/cdrom.repo <<EOF
[cdrom]
name=cdrom
baseurl=http://192.168.122.103
enabled=1
gpgcheck=0
EOF
yum install openssh-server httpd php php-mysql mariadb-server net-tools -y
mkdir /var/run/sshd
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
echo "123456" | passwd root --stdin
/usr/sbin/sshd -D & 启动ssh
/usr/sbin/httpd -D FOREGROUND & 启动http
mysql_install_db --user=mysql --datadir=/var/lib/mysql 启动mysql
/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &
vim /data/vol/html/info.php 测试界面
<?php
Phpinfo();
?>
mysql -uroot -p
grant all *.* to root@'%' identified by '123456';
grant all *.* to root@'localhost' identified by '123456';
create database discuz charset utf8;
docker commit centos_lamp onlineyh/centos7.9_lamp:v1 手动构建镜像
宿主机操作:
docker run -d --name "centos_lamp1" -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html -p 80:80 -p 2222:22 -p 33060:3306 onlineyh/centos7.9_lamp:v1 /usr/sbin/sshd -D
wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
unzip Discuz_X3.2_SC_UTF8.zip
mv upload/* /data/vol/html/
chmod -R go+w config data uc_client uc_server
http://192.168.122.102 下一步 注意mysql服务器输入172.17.0.2 容器的ip 或者手动修改localhost的密码
docker commit centos_lamp1 onlineyh/centos7.9_lamp:v2
[root@gitlab html]# cat /data/vol/html/init.sh 写个脚本
#!/bin/bash
/usr/sbin/httpd -D FOREGROUND &
/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &
/usr/sbin/sshd -D
运行下面程序 这样就跑起来了
docker run -d -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html -p 80:80 -p 2222:22 -p 33060:3306 onlineyh/centos7.9_lamp:v3 /var/www/html/init.sh
mysql -uroot -h192.168.122.102 -P33060 -p123456
ssh 192.168.122.102 -p2222
5. docker dockerfile
5.1 docker 具有sshd功能
[root@gitlab centos-sshd]# cat dockerfile
FROM centos:centos7.9.2009
RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
RUN yum makecache fast && yum install openssh-server -y && mkdir /var/run/sshd && sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config && ssh-keygen -A
RUN echo "123456"|passwd root --stdin
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
docker build -t "sshd:v1" . 构建
docker run -d -P --name "ssh1" sshd:v1 使用登录测试
5.2 docker使用systemctl命令启动sshd
https://github.com/docker-library/docs/tree/master/centos#systemd-integration
vim Dockerfile
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
docker build -t "centos7.9:v1" . 基础镜像
[root@gitlab ssh]# vim dockerfile
FROM centos7.9:v1
RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
RUN yum makecache fast && yum install openssh-server iproute net-tools -y && rm -rf /var/cache/yum/*
RUN echo '123456' | passwd root --stdin
RUN systemctl enable sshd
EXPOSE 22
CMD ["/usr/sbin/init"]
docker build -t "centos_sshd:v2" .
docker run -tid --privileged=true --name testssh -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 2022:22 centos_sshd:v2 注意必须加--privileged=true
5.3 docker使用systemctl命令lamp
FROM centos7.9:v1
RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
RUN yum makecache fast && yum install openssh-server iproute net-tools httpd mariadb-server php php-mysql -y && rm -rf /var/cache/yum/*
RUN echo '123456' | passwd root --stdin
RUN systemctl enable sshd mariadb httpd
VOLUME [ "/var/www/html" ]
EXPOSE 80
EXPOSE 3306
EXPOSE 22
CMD ["/usr/sbin/init"]
docker build -t "lamp:v1" .
docker run -tid --privileged=true --name lamp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /data/html:/var/www/html -P lamp:v1
5.4 docker dokcerfile介绍
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建
通过使用build命令,根据Dockerfiel的描述来构建镜像
通过源代码路径的方式
通过标准输入流的方式
Dockerfile指令:
只支持Docker自己定义的一套指令,不支持自定义
大小写不敏感,但是建议全部使用大写
根据Dockerfile的内容顺序执行
FROM:
FROM {base镜像}
必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
MAINTAINER:
可选的,用来标识image作者的地方
RUN:
每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base
一个Dockerfile中可以包含多个RUN,按定义顺序执行
RUN支持两种运行方式:
RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行
RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径
RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
例如 这条命令 mysql_install_db --user=mysql --datadir=/var/lib/mysql 修改成如下
RUN ["mysql_install_db", "--user=mysql"," --datadir=/var/lib/mysql"]
CMD:
CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
CMD定义的三种方式:
CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行
CMD ["executable","arg1",....]
CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数
EXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>...]。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
entrypoint:
entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
当定义了entrypoint以后,CMD只能够作为参数进行传递
entrypoint定义方式:
entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数
entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令
ADD & COPY:
当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中
ADD和COPY的源必须在context路径下
当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以
work
ADD相对COPY还有一个多的功能,能够进行自动解压压缩包 只支持.tar.* 不支持zip
ENV:
ENV key value
用来设置环境变量,后续的RUN可以使用它所创建的环境变量
当创建基于该镜像的container的时候,会自动拥有设置的环境变量
WORKDIR:
用来指定当前工作目录(或者称为当前目录)
当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
USER:
指定UID或者username,来决定运行RUN指令的用户
ONBUILD:
ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令
可以定义多个ONBUILD指令
当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令
ONBUILD <DOCKERFILE 指令> <content>
VOLUME:
用来创建一个在image之外的mount point,用来在多个container之间实现数据共享
运行使用json array的方式定义多个volume
VOLUME ["/var/data1","/var/data2"]
或者plain text的情况下定义多个VOLUME指令
[root@hk tmp]# cat Dockerfile
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
[root@hk tmp]# docker build -t redis:v3.2.5 . 开始构造 是&&不会分出多层
[root@hk tmp]# docker history redis:v3.2.5 --no-trunc 长格式显示构造记录
6. docker registry
6.1 Harbor镜像仓库的搭建
https://github.com/goharbor/harbor/releases
https://docs.docker.com/compose/install/#prerequisites
选择离线安装版harbor-offline-installer-v2.1.2.tgz (offline离线版 online在线版)
wget https://github.com/goharbor/harbor/releases/download/v2.1.2/harbor-offline-installer-v2.1.2.tgz
Harbor镜像 需要安装docker
需要有docker-compose
vim docker-compose.yml
version: "3.0" ##定义版本号
services: ##服务
tomcat: ##服务名称
container_name: test ##容器名称
image: tomcat:8 ##依赖镜像文件名称
ports: ##映射端口
- 8081:8080 ##外部 内部
volumes: ##数据卷
- /data/test:/etc/test ##外部 内部
networks:
- mytest
networks: ##自定义桥
mytest:
[root@mon02 tomcat]# vim docker-compose.yml
version: "3.0"
services:
tomcat8080:
image: tomcat:8
ports:
- 8080:8080
volumes:
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks:
- mayikt_web
tomcat8081:
image: tomcat:8
ports:
- 8081:8080
volumes:
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks:
- mayikt_web
networks:
mayikt_web:
portainer可视化
https://portainer.readthedocs.io/en/stable/deployment.html
$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
6.1.1 compose的安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose version
6.1.2 harbor 安装
tar xf harbor-offline-installer-v2.1.2.tgz -C /usr/local/
cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
hostname: 192.168.122.107 域名
#https: 注释掉https
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
harbor_admin_password: admin 密码
./install.sh
http://192.168.122.107 admin admin
6.1.3 推送镜像
[root@gitlab ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],"insecure-registries":["192.168.122.107"]
}
systemctl restart docker
docker image tag nginx:latest 192.168.122.107/onlineyh/nginx:v1
docker login 192.168.122.107
admin
admin
docker push 192.168.122.107/onlineyh/v2ray:v1
6.1.4 拉取镜像 harbor设置公开 不然需要登录
[root@gitlab ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],"insecure-registries":["192.168.122.107"]
}
docker pull 192.168.122.107/onlineyh/v2ray:v1
6.1.5 harbor仓库重启关闭
cd /usr/local/harbor/
后台启动容器:docker-compose up -d
查看容器:docker-compose ps
停止并删除容器:docker-compose down
停止启动容器:docker-compose stop; docker-compose start
[root@mysql harbor]# grep "data_volume" harbor.yml
data_volume: /data 有使用数据卷 在宿主机/data 目录 所以再次关闭启动都不会丢失文件
docker login 192.168.122.107 登录成功保存文件如下
[root@gitlab ~]# cat /root/.docker/config.json
{
"auths": {
"192.168.122.107": {
"auth": "YWRtaW46YWRtaW4="
}
}
6.2 docker registry 容器仓库
6.2.1 registry 简单操作
docker pull registry
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
docker image tag nginx:latest 192.168.122.107:5000/onlineyh/nginx:v1
docke push 192.168.122.107:5000/onlineyh/nginx:v1
[root@gitlab ~]# curl 192.168.122.107:5000/v2/_catalog 看到信息
{"repositories":["onlineyh/nginx","onlineyh/v2ray"]}
6.2.2registry 密码认证 使用apache认证
生成密码:
yum install httpd-tools -y
mkdir /opt/registry-auth/ -p
htpasswd -Bbn test 123 >> /opt/registry-auth/htpasswd >>这样不会覆盖之前的
htpasswd -Bbn test1 123 >> /opt/registry-auth/htpasswd
[root@oldboy ~]# docker login 192.168.122.107:5000
Username: test
Password:
docker image tag nginx:latest 192.168.122.107:5000/onlineyh/nginx:v2
docke push 192.168.122.107:5000/onlineyh/nginx:v2
docker 关机或者重启服务docker自动启动
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
.....
......
"live-restore": true
}
7. docker 网络
7.1 docker 网络介绍
[root@mysql ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e3508f839e38 bridge bridge local
ba42d1b01b05 harbor_harbor bridge local
f61454c39d00 host host local
124d1328b097 none null local
docker network rm harbor_harbor 删除网络模式
Docker容器的网络模式
bridge模式,让容器跟docker0网卡桥接。上网通过nat上网
host模式,让容器和宿主机共享网络
none,关闭容器网络
brctl show 查看桥接情况
docker run -d --network=host nginx:latest 使用 --net=指定网络模式
7.2 Docker跨主机访问-macvlan实现
两台主机同时执行:
网卡设为混杂模式
yum intall -y net-tools
ifconfig eth0 -promisc 设置混杂模式
ifconfig eth0 -promisc 取消混杂模式
docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=eth0 mac1
-d 指定 Docker 网络 driver
--subnet 指定 macvlan 网络所在的网络
--gateway 指定网关
-o parent 指定用来分配 macvlan 网络的物理网卡
docker run -itd --name c1 --ip=172.16.10.2 --network mac1 busybox
docker run -itd --name c2 --ip=172.16.10.3 --network mac1 busybox
docker run -itd --name c3 --ip=172.16.10.30 --net=mac1 busybox
7.3 Docker 跨主机访问-overlay实现
docker run -d -p 8500:8500 -h consul --name consul --alway=restart progrium/consul -server -bootstrap
[root@gitlab ~]# vim /lib/systemd/system/docker.service 修改下面2行 eth0是网卡 ip 网卡根据实际修改
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 原来的
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store consul://192.168.122.102:8500 --cluster-advertise eth0:2376
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
systemctl daemon-reload
systemctl restart docker
创建网络接口
docker network create -d overlay --subnet 172.12.0.0/24 --gateway 172.12.0.1 overlay1
另一台主机修改
[root@gitlab ~]# vim /lib/systemd/system/docker.service 修改下面2行 eth0是网卡 ip 网卡根据实际修改
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 原来的
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store consul://192.168.122.102:8500 --cluster-advertise eth0:2376
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
systemctl daemon-reload
systemctl restart docker
docker network ls 查看 另一台主机创建的overlay1 是否已经过来
[root@gitlab ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
30f908468367 bridge bridge local
75a25cb73af0 docker_gwbridge bridge local
a5905ea56eeb host host local
fa3e9d1b89ab mac1 macvlan local
fceace67fab7 none null local
cb58c75922de overlay1 overlay global
docker run -it --network overlay1 --name t1 busybox /bin/sh
docker run -it --network overlay1 --name t2 busybox /bin/sh