Docker端口映射
#1. 端口映射(-p)
#格式:
-p80:81 -p宿主机端口:容器内部端口
[root@docker01 ~]# docker pull nginx:1.18.0
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0 741d47c34fe0 2 weeks ago 132MB
[root@docker01 ~]# docker tag 741d47c34fe0 qls123/nginx:v1.18.0
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0 741d47c34fe0 2 weeks ago 132MB
qls123/nginx v1.18.0 741d47c34fe0 2 weeks ago 132MB
[root@docker01 ~]# docker run --name nginx01 -d -p81:80 qls123/nginx:v1.18.0
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1732bbfe4b8f qls123/nginx:v1.18.0 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:81->80/tcp nginx01
[root@docker01 ~]# netstat -lntp
tcp6 0 0 :::81 :::* LISTEN 2000/docker-proxy
[root@docker01 ~]# curl 127.0.0.1:81
Docker挂载数据卷
#baidu的首页
[root@docker01 ~]# mkdir html
[root@docker01 ~]# cd html
[root@docker01 html]# wget www.baidu.com -O index.html
#运行容器进行挂载(-v)
##-v宿主机的目录:容器的目录
[root@docker01 html]# docker run --name nginx02 -d -p82:80 -v/root/html:/usr/share/nginx/html qls123/nginx:v1.18.0
[root@docker01 html]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07565a867000 qls123/nginx:v1.18.0 "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:82->80/tcp nginx02
[root@docker01 html]# curl 127.0.0.1:82
#查看挂载信息
[root@docker01 html]# docker inspect 07565a867000 | grep /usr/share
"/root/html:/usr/share/nginx/html"
"Destination": "/usr/share/nginx/html"
Docker容器传递环境变量
#-e #传递环境变量
[root@docker01 html]# docker run --rm -e TEST=hello qls123/nginx:v1.18.0 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=16526ff23fff
TEST=hello
NGINX_VERSION=1.18.0
NJS_VERSION=0.4.0
PKG_RELEASE=1~buster
HOME=/root
Docker容器内安装软件
[root@docker01 html]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07565a867000 qls123/nginx:v1.18.0 "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 0.0.0.0:82->80/tcp nginx02
[root@docker01 html]# docker exec -ti nginx02 /bin/bash
tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
EOF
root@07565a867000:/# tee /etc/apt/sources.list << EOF
> deb http://mirrors.163.com/debian/ jessie main non-free contrib
> deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
> EOF
root@07565a867000:/# apt-get update && apt-get install curl -y
root@07565a867000:/# apt-get install inetutils-ping -y
[root@docker01 html]# docker commit -p 07565a867000 qls123/nginx:1.18.0-curl
[root@docker01 html]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qls123/nginx 1.18.0-curl eb440e397100 8 seconds ago 153MB
[root@docker01 html]# docker push qls123/nginx:1.18.0-curl
Docker容器的生命周期
1. 检查本地是否存在镜像,如果没有则从远程官方仓库查询下载
2. 利用镜像启动容器
3. 分配一个文件系统,并在只读的镜像层外挂载一层可读可写层 这个就是容器
4. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
5. 从地址池配置一个IP地址给容器
6. 执行用户指定的命令
7. 执行完毕后容器终止
#了解更多的docker指令
[root@docker01 html]# docker --help
Dockerfile应用
如何自定义一个镜像
docker commit
黑箱操作: 不知道别人在里面做了写什么,维护非常困难 不建议通过commit方式来创建镜像
简单,方便
Dockerfile制作镜像
就是一个文本文件 文件名只能是Dockerfile 里面其实就是一组组命令
docker build 进行构建镜像
Dockerfile的规则
1. 格式
#注释
指令大写,内容小写 大小写是没有太多的强制要求, 我们强烈要求使用指令大写,内容小写
2. Dockerfile是按照顺序执行里面的指令的 从上到下依次执行
3. 每一个dockerfile的第一个非注释指令,必须是“FROM”用户为镜像文件创建的过程中,指定的基础镜像
4. 在实践中,基础镜像可以是任何可用的镜像文件,默认情况下,docker build会在本地查找dockerfile上面指定的镜像,当本地不存在这个镜像时,则会从官方远程仓库拉取
Dockerfile核心指令
FROM #指定基础镜像
USER #指定运行的用户
WORKDIR #指定容器的工作目录
COPY #复制文件
ADD #高级复制,会自动解压文件
RUN #执行的命令
EXPOSE #指定对外的端口,用到的不多 -p -P
ENV #设置环境变量
CMD #容器启动后执行的命令
ENTRYPOINT #容器启动后执行的命令
RUN #执行命令并创建新的镜像层,通常用于安装软件包
CMD #设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
ENTRYPOINT #配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)
USER/WORKDIR指令
[root@docker01 ~]# mkdir /data/dockerfile -p
[root@docker01 ~]# cd /data/dockerfile/
[root@docker01 dockerfile]# vim Dockerfile
FROM qls123/nginx:v1.18.0
USER nginx
WORKDIR /usr/share/nginx/html
[root@docker01 dockerfile]# docker build . -t qls123/nginx:v1.18.0_with_user_workdir
[root@docker01 dockerfile]# docker images |grep with_user_workdir
qls123/nginx v1.18.0_with_user_workdir 4330bb7b48b9 43 seconds ago 132MB
[root@docker01 dockerfile]# docker run --rm -ti --name nginx03 qls123/nginx:v1.18.0_with_user_workdir /bin/bash
nginx@4430adea4186:/usr/share/nginx/htmlpwd
/usr/share/nginx/html
nginx@4430adea4186:/usr/share/nginx/html whoami
nginx
nginx@4430adea4186:/usr/share/nginx/html$ exit
exit
ADD/EXPOSE指令
[root@docker01 dockerfile]# cat Dockerfile
FROM qls123/nginx:v1.18.0
ADD html/index.html /usr/share/nginx/html/index.html
EXPOSE 80
[root@docker01 dockerfile]# docker build . -t qls123/nginx:v1.18.0_with_index_expose
[root@docker01 dockerfile]# docker images | grep with_index_expose
qls123/nginx v1.18.0_with_index_expose 3ec08a1f4e21 49 seconds ago 132MB
[root@docker01 dockerfile]# docker run -d --name nginx04
qls123/nginx:v1.18.0_with_index_expose /bin/bash
[root@docker01 dockerfile]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1977de4e3cd0 qls123/nginx:v1.18.0_with_index_expose "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp nginx04
[root@docker01 dockerfile]# netstat -lntp
tcp6 0 0 :::32768 :::* LISTEN 14207/docker-proxy
[root@docker01 dockerfile]# curl 127.0.0.1:32768
[root@docker01 dockerfile]# docker exec -ti nginx04 /bin/bash
root@1977de4e3cd0:/# pwd
/
root@1977de4e3cd0:/# ls /usr/share/nginx/html
50x.html index.html
RUN/ENV指令
[root@docker01 dockerfile]# cat Dockerfile
FROM centos:7.7.1908
ENV VER 4.9.2
RUN yum install -y tcpdump-$VER
[root@docker01 dockerfile]# docker build . -t qls123/centos:7.7.1908_with_env_run
[root@docker01 dockerfile]# docker images | grep centos
qls123/centos 7.7.1908_with_env_run 428dfd24f45b 39 seconds ago 276MB
[root@docker01 dockerfile]# docker run --rm -ti qls123/centos:7.7.1908_with_env_run /bin/bash
[root@fcc5a8b2c4a1 /]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@fcc5a8b2c4a1 /]# printenv | grep VER
VER=4.9.2
[root@fcc5a8b2c4a1 /]# tcpdump --version
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
[root@fcc5a8b2c4a1 /]# exit
exit
CMD/ENTPYPOINT指令
[root@docker01 dockerfile]# cat Dockerfile
FROM centos:7.7.1908
RUN yum install httpd -y
CMD ["httpd","-D","FOREGROUND"]
[root@docker01 dockerfile]# docker build . -t qls123/centos:7.7.1908_with_httpd
[root@docker01 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qls123/centos 7.7.1908_with_httpd f7fb892b142a 27 seconds ago 308MB
[root@docker01 dockerfile]# docker run --rm -d --name httpd01 -p83:80 qls123/centos:7.7.1908_with_httpd
[root@docker01 dockerfile]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b5a0991571d qls123/centos:7.7.1908_with_httpd "httpd -D FOREGROUND" 12 seconds ago Up 11 seconds 0.0.0.0:83->80/tcp httpd01
[root@docker01 dockerfile]# netstat -lntp |grep 83
tcp6 0 0 :::83 :::* LISTEN 14896/docker-proxy
ENTPYPOINT指令
[root@docker01 dockerfile]# cat Dockerfile
FROM centos:7.7.1908
COPY entrypoint.sh /entrypoint.sh
RUN yum install epel-release -y && yum install -y nginx
ENTRYPOINT /entrypoint.sh
#编写脚本
[root@docker01 dockerfile]# cat entrypoint.sh
#!/bin/bash
/sbin/nginx -g "daemon off;"
[root@docker01 dockerfile]# chmod +x entrypoint.sh
[root@docker01 dockerfile]# docker build . -t qls123/centos:7.7.1908_with_entrypoint
[root@docker01 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qls123/centos 7.7.1908_with_entrypoint 31d6ad566c7f 27 seconds ago 389MB
[root@docker01 dockerfile]# docker run -d --name nginx06 -p84:80 qls123/centos:7.7.1908_with_entrypoint
[root@docker01 dockerfile]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99b1852dfe89 qls123/centos:7.7.1908_with_entrypoint "/bin/sh -c /entrypo…" 4 seconds ago Up 3 seconds 0.0.0.0:84->80/tcp nginx06
[root@docker01 dockerfile]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::84 :::* LISTEN 15281/docker-proxy
Docker综合实验
使用域名的方式访问百度首页
实现小游戏
[root@docker01 dockerfile]# cat Dockerfile
FROM qls123/nginx:v1.18.0
USER root
ENV WWW /usr/share/nginx/html
ENV CONF /etc/nginx/conf.d
RUN echo 'Asia/Shanghai' >/etc/timezone
ADD xiaoniao.tar.gz WWW/
ADD xiaoniao.com.confCONF/xiaoniao.com.conf
CMD ["nginx","-g","daemon off;"]
[root@docker01 dockerfile]# cat xiaoniao.com.conf
server {
listen 80;
server_name xiaoniao.com;
root /usr/share/nginx/html/xiaoniao;
}
[root@docker01 dockerfile]# docker build . -t qls123/nginx:v1.18.0_with_xiaoniao
[root@docker01 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qls123/nginx v1.18.0_with_xiaoniao 7dc18f3dbbae 17 seconds ago 132MB
[root@docker01 dockerfile]# docker run --rm -d --name xiaoniao -p81:80 qls123/nginx:v1.18.0_with_xiaoniao
[root@docker01 dockerfile]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3522a2f9a357 qls123/nginx:v1.18.0_with_xiaoniao "nginx -g 'daemon of…" 3 seconds ago Up 3 seconds 0.0.0.0:81->80/tcp xiaoniao
Docker registry
本地镜像仓库 镜像注册中心
普通的registry
[root@docker01 dockerfile]# mkdir -p /data/myregistry
[root@docker01 dockerfile]# docker run -d -p5000:5000 --restart=always --name registry -v/data/myregistry:/var/lib/registry registry
#创建容器时没有添加参数 --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。
[root@docker01 dockerfile]# docker images | grep registry
registry latest 708bc6af7e5e 4 months ago 25.8MB
[root@docker01 dockerfile]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfb55998b06 registry "/entrypoint.sh /etc…" 50 seconds ago Up 49 seconds 0.0.0.0:5000->5000/tcp registry
[root@docker01 dockerfile]# netstat -lntp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::5000 :::* LISTEN 16571/docker-proxy
[root@docker01 dockerfile]# docker tag nginx:1.18.0 47.102.199.135:5000/qls/nginx:v1.18.0
[root@docker01 dockerfile]# docker push 47.102.199.135:5000/qls/nginx:v1.18.0
The push refers to repository [47.102.199.135:5000/qls/nginx]
#报错:要求https访问,但此处用的的是http方式请求
Get https://47.102.199.135:5000/v2/: http: server gave HTTP response to HTTPS client
#解决上述报错方法
[root@docker01 dockerfile]# cat /etc/docker/daemon.json
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io","47.102.199.135:5000"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.151.143.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
}
[root@docker01 dockerfile]# systemctl restart docker
[root@docker01 dockerfile]# docker push 47.102.199.135:5000/qls/nginx:v1.18.0
[root@docker01 dockerfile]# ll /data/myregistry/docker/registry/v2/repositories/qls/nginx/
total 12
drwxr-xr-x 3 root root 4096 Jun 3 15:52 _layers
drwxr-xr-x 4 root root 4096 Jun 3 15:53 _manifests
drwxr-xr-x 2 root root 4096 Jun 3 15:53 _uploads
#拉取本地仓库镜像
[root@docker01 dockerfile]# docker pull 47.102.199.135:5000/qls/nginx:v1.18.0
#其他主机上传下载
[root@docker01 ~]# docker pull 47.102.199.135:5000/qls/nginx:v1.18.0
v1.18.0: Pulling from qls/nginx
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qls123/alpine v3.12.0 a24bb4013296 4 days ago 5.57MB
47.102.199.135:5000/qls/nginx v1.18.0 741d47c34fe0 2 weeks ago 132MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
[root@docker01 ~]# docker tag a24bb4013296 47.102.199.135:5000/qls/alpine:v3.12.0
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
47.102.199.135:5000/qls/alpine v3.12.0 a24bb4013296 4 days ago 5.57MB
[root@docker01 ~]# docker push 47.102.199.135:5000/qls/alpine:v3.12.0
带basic认证的registry
删除仓库里面的镜像
#删除repo
/ # rm -rf /var/lib/registry/docker/registry/v2/repositories/qls/nginx/
#清除blob
/ # registry garbage-collect /etc/docker/registry/config.ym
Docker网路模型
NAT(默认) Bridge
[root@docker01 ~]# docker exec -ti 2b5c6a379cda /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:97:8f:02 brd ff:ff:ff:ff:ff:ff
inet 172.151.143.2/24 brd 172.151.143.255 scope global eth0
valid_lft forever preferred_lft forever
None
#不为容器配置任何网络
[root@docker01 ~]# docker run -ti --rm --net=none alpine /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
Host
#与宿主机共享网络 性能最高
[root@docker01 ~]# docker run -ti --rm --net=host alpine:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:0c:f5:f8 brd ff:ff:ff:ff:ff:ff
inet 172.19.151.143/20 brd 172.19.159.255 scope global dynamic eth0
valid_lft 315329713sec preferred_lft 315329713sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ba:16:7c:80 brd ff:ff:ff:ff:ff:ff
inet 172.151.143.1/24 brd 172.151.143.255 scope global docker0
valid_lft forever preferred_lft forever
37: veth15e9b65@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 4e:cb:a7:65:21:80 brd ff:ff:ff:ff:ff:ff
联合网络
#与另一个运行中的容器共享网络
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b5c6a379cda registry "/entrypoint.sh /etc…" 47 minutes ago Up 47 minutes 0.0.0.0:5000->5000/tcp sad_meninsky
[root@docker01 ~]# docker exec -ti 2b5c6a379cda /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:97:8f:02 brd ff:ff:ff:ff:ff:ff
inet 172.151.143.2/24 brd 172.151.143.255 scope global eth0
valid_lft forever preferred_lft forever
[root@docker01 ~]# docker run -ti --rm --net=container:2b5c6a379cda alpine:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:97:8f:02 brd ff:ff:ff:ff:ff:ff
inet 172.151.143.2/24 brd 172.151.143.255 scope global eth0
valid_lft forever preferred_lft forever
Docker-Compose应用
单机编排工具
通过yaml文件进行
工程 project
服务 service
容器 container
使用docker-compose安装wordpress
#安装Docker-compose
[root@docker01 ~]# yum install -y docker-compose
[root@docker01 ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
[root@docker01 ~]# mkdir /data/docker-compose
[root@docker01 ~]# cd /data/docker-compose
[root@docker01 docker-compose]# mkdir wordpress
[root@docker01 docker-compose]# cd wordpress
[root@docker01 wordpress]# cat docker-compose.yaml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
web_data:
#后台启动容器
[root@docker01 ~]# docker-compose up -d
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53d59cde1a0d wordpress:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp wordpress_wordpress_1
3e29e83fc01d mysql:5.7 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp, 33060/tcp wordpress_db_1
docker-compose常用命令
# 启动所有容器
docker-compose up
#放入到后台运行
docker-compose -d
#停用移除所有容器以及网络相关
docker-compose down
#列出项目中所有的容器
docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:32770->80/tcp
#停止正在运行的容器
[root@docker01 wordpress]# docker-compose stop
#启动已经存在的服务容器
[root@docker01 wordpress]# docker-compose start
#查看服务容器的输出
[root@docker01 wordpress]# docker-compose logs
Docker跨主机容器之间的通信
#查看local网络信息
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8a69b5227305 bridge bridge local
0ef42ec5e12e host host local
76a3e990ef90 none null local
创建macvlan网络
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d1cdabe73593 macvlan_1 macvlan local
[root@docker01 ~]# docker run --rm -ti --network macvlan_1 --ip=10.0.0.101 qls123/alpine:v3.12.0 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
47: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:0a:00:00:65 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.101/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 10.0.0.102
PING 10.0.0.102 (10.0.0.102): 56 data bytes
64 bytes from 10.0.0.102: seq=0 ttl=64 time=0.326 ms
64 bytes from 10.0.0.102: seq=1 ttl=64 time=0.350 ms
[root@docker02 ~]# docker run --rm -ti --network macvlan_1 --ip=10.0.0.102 alpine:3.12.0 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
9: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:0a:00:00:66 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.102/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 10.0.0.101
PING 10.0.0.101 (10.0.0.101): 56 data bytes
64 bytes from 10.0.0.101: seq=0 ttl=64 time=2.328 ms
64 bytes from 10.0.0.101: seq=1 ttl=64 time=0.611 ms