查看 Docker 版本包括 Docker 版本号、API 版本号、对应的 Git Commit、Containerd 和 runC 的版本信息等。
# docker version
Client: Docker Engine - Community
Version: 20.10.4
API version: 1.40
Go version: go1.12.10
Git commit: 9013bf583a
Built: Fri Oct 18 15:52:22 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 20.10.4
API version: 1.40 (minimum version 1.12)
Go version: go1.12.10
Git commit: 9013bf583a
Built: Fri Oct 18 15:50:54 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683docker search harbor.xxx.net/frontend:v1# docker images | grep nginx-v2
nginx-v2 latest 3d9c6e44d3db 3 hours ago 109MB# docker run -ti -p 1111:80 nginx bash
root@cd676d572188:/## docker logs -f 容器 ID/容器名称 --tail 1
W0805 09:58:41.745799 8 controller.go:1130] SSL certificate for
server "xxx" is about to expire (2020-06-19 03:44:03 +0000 UTC)# docker run -ti -p 1111:80 -v /etc/hosts:/etc/hosts nginx bash
root@cd676d572188:/#查看所有容器,包括已经退出的:
docker ps -a查看正在运行的容器(即显示出容器的 ID):
# docker ps -q
...
0d1a98b3c402
c1fd8ff1f7f2
86b1c069024b
...查看所有容器的 ID,包括已经退出的:
# docker ps -aq
...
17019738d93d
进入到一个后台运行的容器(即之前用-d 命令参数来指定后台运行方式的容器):
# docker ps | tail -1
86b1c069024b nginx:latest "nginx -g 'daemon ..." 4 days ago
Up 21 hours 80/tcp, 0.0.0.0:16443->16443/tcp nginx-lb
# docker exec -ti 86b1c069024b bash
root@nginx-lb:/#将本机的文件拷贝到容器,拷贝支持双向拷贝,也支持将容器的内部文件拷贝到宿主机:
# docker cp README.md 92aceec0dcdd327a709bf0ec83:/tmp
#exec 也可直接执行容器命令
# docker exec 92aceec0dcdd327a709bf0ec83 ls /tmp/
README.md删除已经退出的容器:
删除本机镜像,比如删除 REPOSITORY 或 TAG 为 none 的镜像:
区分镜像的版本可以使用 tag 命令给镜像打标签:
使用 docker build 通过 Dockerfile 制作镜像。注意最后的一个点( . ),表示使用当前目录 进行构建镜像:
# docker build -t image_name:image_tag .# docker inspect 1de2ef08945f | grep Port
Dockerfile 的常用命令如下:
FROM:继承基础镜像
# cat Dockerfile
# base image
执行构建并启动测试:
# 执行构建
# docker build -t centos:env-cmd .
# 启动镜像验证 ENV 和 CMD
# docker run centos:env-cmd
envir:test version:1.0执行构建并测试:
# docker build -t centos:entrypoint .
# docker run --rm centos:entrypoint
envir:test version:1.0CMD 可以被覆盖:
# docker run --rm centos:env-cmd echo "cover..." cover... ENTRYPOINT 指定的不能被直接覆盖:
# docker run --rm centos:entrypoint cannot cover... envir:test version:1.0ENTRYPOINT 指定--entrypoint 参数,比如指定 entrypoint 为 ls,后置命令为/tmp,就相当于 ENTRYPOINT 是 ls,CMD 是/tmp
# docker run --rm --entrypoint=ls centos:entrypoint /tmp anaconda-post.log yum.log使用 ADD 添加一个压缩包,使用 WORKDIR 改变工作目录:
# base image
FROM nginx
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html使用 COPY 拷贝指定目录下的所有文件到容器,不包括本级目录。 此时只会拷贝 webroot 下的所有文件,不会将 webroot 文件夹拷贝过去:
# base image
FROM nginx
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html
COPY webroot/ .LABEL 和 MAINTAINER
Dockerfile使用MAINTAINER定义作者信息,但是这个参数将来会被弃用,可以使用LABEL
进行替换:制作镜像并查看镜像信息:
使用 ARG 和 build-arg 传入动态变量:
基础镜像体积:
# docker images | grep user
centos user 9457226f9505 7 minutes ago 194MB那这 194MB 是怎么来的呢?首先看一下创建用户的 Dockerfile:
# cat Dockerfile
# base image
FROM centos:7
MAINTAINER dot
RUN useradd dot再来看一下执行 docker build 生成镜像时控制台的日志:
可以使用 docker history 看一下每个层的大小:
将之前创建用户的 Dockerfile 改为 Alpine 镜像
# cat Dockerfile
# base image
# FROM centos:7
FROM alpine:3.12
MAINTAINER dot
RUN adduser -D dotAlpine 镜像创建用户的命令为 adduser,-D 表示不设置密码
执行构建并查看镜像大小
# docker build -t alpine:user .
创建 Go 语言 Hello World 程序:
# cat hw.go
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
单阶段构建:
# build step
FROM golang:1.14.4-alpine
WORKDIR /opt
COPY hw.go /opt
RUN go build /opt/hw.go
CMD "./hw"执行构建并运行测试:
# docker build -t hw:one .
Successfully built e036098fbb2e
Successfully tagged hw:one
# docker run --rm hw:one
Hello World!查看此时由一个阶段构建的镜像大小:
# docker images | grep e036098fbb2e
hw one e036098fbb2e 5 minutes ago
372MB可以看到此时镜像大小为 372MB,但是上述的代码我们只需要构建步骤产生的二进制文件 hw 即可,这个文件大小可以进入到容器内部看一下:
# docker run --rm hw:one du -sh ./hw
2.0M ./hw多阶段 Dockerfile 构建:
再次构建后查看此时的镜像大小和运行镜像的效果:
# docker build -t hw:multi .
# docker images |grep multi
hw multi a3bba8204f75 6 minutes ago 2.07MB
# docker run --rm hw:multi
Hello World!1.更新 Ubuntu
sudo apt update
sudo apt upgrade
sudo aptsudo apt update:此命令用于更新软件包列表,它会检查可用的软件包更新并下载相应的元数据信息。这样可以确保您系统中的软件包信息是最新的。
sudo apt upgrade:此命令用于升级可用的软件包。它会将系统中已安装的软件包升级到最新可用版本。在执行此命令之前,建议先执行sudo apt update以获取最新的软件包列表。
sudo apt full-upgrade:此命令类似于sudo apt upgrade,但它在升级软件包时更为彻底。它会处理软件包之间的依赖关系,并在必要时进行更大的系统修改。因此,sudo apt full-upgrade可能会进行一些额外的操作,如删除旧的软件包或安装新的依赖项。2.添加 Docker 库
首先,安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release然后,运行下列命令添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg添加 Docker 官方库
3.使用命令更新 Ubuntu 源列表
sudo apt update4.安装 Docker
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin当然你也可以安装其他版本 Docker 。运行下列命令检查可以安装的 Docker 版本
sudo apt-cache madison docker-ce更换阿里云镜像地址
tee /etc/docker/daemon.json <<-'EOF'
{
5.启动docker
sudo systemctl start docker
sudo systemctl enable docker以数据卷的方式,将自定义的宿主机目录或文件提供给容器使用,比如容器可以直接挂载宿主机本地的数据目录(如mysql容器的数据持久化)、配置文件(如nginx的配置文件)、静态文件(如web服务的图片或js文件)等,只需要在创建容器的时候指定挂载即可。
# mkdir /data/testapp –p
# echo "testapp web page" > /data/testapp/index.html
# cat /data/testapp/index.html
testapp web page启动两个测试容器,web1容器和web2容器,分别测试能否访问到宿主机的数据,注意使用-v参数,将宿主机目录映射到容器内部,web2的ro 表示在容器内对该目录只读,默认的权限是可读写的:
# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 80:80 nginx:1.20.2
# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 81:80 nginx:1.20.2nginx多卷挂载
# mkdir /data/nginx/conf -p
# docker cp web1:/etc/nginx/nginx.conf /data/nginx/conf/
mysql容器
创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容,如下
# docker rm -f web3
# ls /data/testapp/index.html
/data/testapp/index.html #挂载的数据卷不会被删除数据卷的特点及使用
数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
在容器里面的写入数据不会影响到镜像本身。数据卷使用场景
容器数据持久化(mysql数据、nginx日志等类型)
静态web页面挂载
应用配置文件挂载
多容器间的目录或文件共享数据卷容器功能是可以让数据在多个docker容器之间共享,即先要创建一个后台运行的A容器作为Server,之后创建的B容器、C容器等都可以同时访问A容器的内容,因此数据卷容器用于为其它容器提供卷的挂载继承服务,数据卷为其它容器提供数据读写服务,A容器称为server端、其它容器成为client端:
卷容器Server
# docker run -d --name volume-server -v /data/testapp:/usr/share/nginx/html/testapp -v
/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8client1
# docker run -d --name web1 --volumes-from volume-server -p80:80 nginx:1.20.2client2
# docker run -d --name web2 --volumes-from volume-server -p81:80 nginx:1.20.2特点
适用于同类服务的数据卷共享
client会继承卷server挂载和挂载权限
停止卷server,也不影响已经运行的容器、甚至也不影响新建容器
删除卷server,不影响已经运行的容器,但是不能新建容器Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16,并且会生成三种不能类型的网络,如下
另外会额外创建三个默认网络,用于不同的使用场景
docker的默认模式即不指定任何模式就是bridge模式,也是目前使用比较多的网络模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信
# docker network inspect bridge
# docker run -it -d --name nginx-web1-bridge-test-container -p 80:80 --net=bridge nginx:1.20.2
host模式就是直接使用宿主机的IP地址,创建的容器如果指定了使用host模式,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+容器端口即可,而且某一个端口一旦被其中一个容器占用那么其它容器就不能再监听此端口,不过容器的其它资源比如容器的文件系统、容器系统进程等还是基于namespace相互隔离。
此模式的网络性能最高,但是各容器之间端口不能相同,适用于运行容器端口比较固定的业务
none模式就是无IP模式,在使用none 模式后,docker 容器不会进行任何网络配置,其没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
Container模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息 等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信。
# docker info
Client: # Client 端
Debug Mode: false # 是否开启 Debug 模式
Server: # Server 端
Containers: 8 # 容器个数
Running: 4 # 正在运行的容器个数
Paused: 0 # 暂停的容器个数
Stopped: 4 # 停止的容器个数
Images: 8 # 镜像个数
Server Version: 20.10.4 # 当前服务器 Docker Server 的版本
Storage Driver: overlay2 # 存储驱动,一般为 overlay2,性能好速度快
# 其他驱动 aufs、overlay、brtfs
Backing Filesystem: xfs # 服务器文件系统
Supports d_type: true # 目录条目类型,用来表示一个文件是文件、管道还是套接字。
# 在格式化 xfs 文件系统时,必须指定 ftype=1
Native Overlay Diff: true
Logging Driver: json-file
# 日志驱动,json-file 表示存在本地
Cgroup Driver: cgroupfs # 限制和隔离的驱动,生产环境建议使用 systemd
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries
splunk syslog # Docker 支持的日志驱动
Swarm: inactive # Docker 官方的容器编排工具,inactive 不开启,active 开启
...
Docker Root Dir: /var/lib/docker # Docker 根目录,生产环境建议使用 SSD 硬盘,或
者独立的磁盘,不要和系统盘用同一个磁盘。
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false # Docker 热更新,生产环境建议设置为 true# 把公网上的镜像拉取到本地服务器,不指定版本号为 latest
# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest:
sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c
Status: Image is up to date for nginx:latest
#拉取指定版本
# docker pull nginx:1.15
1.15: Pulling from library/nginx
Digest:
sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c
Status: Downloaded newer image for nginx:1.15# docker tag nginx-v2 dotbalo/nginx-v2:test
# 如果是推送到自己公司内部的镜像仓库,可以使用如下命令 docker tag nginx-v2 你公司的
镜像仓库地址/nginx-v2:test
# docker images | grep nginx-v2
dotbalo/nginx-v2 test 3d9c6e44d3db 3 hours ago 109MB
nginx-v2 latest 3d9c6e44d3db 3 hours ago 109MB# docker login
Login with your Docker ID to push and pull images from Docker Hub. If
you don't have a Docker ID, head over to https://hub.docker.com to create
one.
Username (dotbalo): dotbalo
Password: 输入仓库密码
Login Succeeded# docker push dotbalo/nginx-v2:test
The push refers to a repository [docker.io/dotbalo/nginx-v2]
2eaa7b5717a2: Mounted from dotbalo/nginx
a674e06ede38: Mounted from dotbalo/nginx
b7efe781401d: Mounted from dotbalo/nginx
c9c2a3696080: Mounted from dotbalo/nginx
7b4e562e58dc: Mounted from dotbalo/nginx
test: digest: sha256:
5d749d2b10150426b510d2c3a05a99cf547c2ca1be382e1dbb2f90b68b6bea96 size: 1362使用 run -ti 前台启动一个容器:
# docker run -ti nginx bash
root@23bc7ccabb09:/#
# 也可以使用-ti --rm 参数,表示前台启动的容器退出后即删除
如果一个镜像需要一直运行,可以使用-d 进行后台启动:
# docker run -tid nginx bash
1bcf5154d5c3a57d92a6796f526eac2cefd962aaca9cf4098689bfe830bb9e5e
# 也可以使用--restart=always,如果容器异常自动重启# docker ps
CONTAINER ID IMAGE
COMMAND CREATED STATUS PORTS
NAMES
862e82066496 94ec7e53edfc
"nginx -g 'daemon ..." 21 hours ago Up 21 hours
k8s_nginx_nginx-deployment-57895845b8-vb7bs_default_d0d254f8-1fb3-11e9-a9f2-
000c293ad492_1
10bf838e18d0 registry.cnhangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 "/pause"
21 hours ago Up 21 hours
k8s_POD_nginx-deployment-57895845b8-vb7bs_default_d0d254f8-1fb3-11e9-a9f2-
000c293ad492_1# docker ps -a |grep Exited | tail -3
600e5da5c196 3cab8e1b9802
"etcd --advertise-..." 4 days ago Exited (137) 21 hours ago
k8s_etcd_etcd-k8s-master01_kube-system_c94bb8ceba1b924e6e3175228b168fe0_0
5a1848d923a1 registry.cnhangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 "/pause"
4 days ago Exited (0) 21 hours ago
k8s_POD_kube-scheduler-k8s-master01_kubesystem_9c27268d8e3e5c14fa0160192a2c7988_0
280fc86494f1 registry.cnhangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 "/pause"
4 days ago Exited (0) 21 hours ago
k8s_POD_etcd-k8s-master01_kube-system_c94bb8ceba1b924e6e3175228b168fe0_0
# docker rm 600e5da5c196 5a1848d923a1 280fc86494f1
600e5da5c196
5a1848d923a1
280fc86494f1
# docker ps -a |grep Exited | grep -E
"600e5da5c196|5a1848d923a1|280fc86494f1"# docker images | grep none
<none><none> 7ad745acca31 2 days ago
5.83MB
dotbalo/canary <none> 00f40cc9b7f6 2 days ago
5.83MB
dotbalo/canary <none> 9b0f2f308931 2 days ago
5.83MB
<none><none> c3d2357e9cbd 2 days ago
4.41MB
dotbalo/nginx <none> 97c97cee03f9 3 days ago
109MB
# docker rmi 7ad745acca31 00f40cc9b7f6 9b0f2f308931 c3d2357e9cbd
97c97cee03f9
Deleted:
sha256:7ad745acca31e3f753a3d50e45b7868e9a1aa177369757a9724bccf0654abcb2
Deleted:
sha256:0546dcf8a97e167875d6563ef7f02ddd8ad3fc0d5f5c064b41e1ce67369b7e06
Untagged:
dotbalo/canary@sha256:cdd99e578cb2cb8e84eaf2e077c2195a40948c9621d32004a9b5f4
e82a408f4d
...
Deleted:
sha256:697f26740b36e9a5aee72a4ca01cc6f644b59092d49ae043de9857e09ca9637e[root@k8s-master02 ~]# docker history 0e55626662ef
IMAGE CREATED CREATED BY SIZE
COMMENT
...
<missing> 21 months ago /bin/sh -c #(nop) CMD ["mysqld"]
0B
<missing> 21 months ago /bin/sh -c #(nop) EXPOSE 3306/tcp 33060/tcp
0B
...# cat Dockerfile
# base image
FROM centos:7
MAINTAINER dot
RUN useradd dot
RUN mkdir dot
ENV envir=test version=1.0
CMD echo "envir:$envir version:$version"# cat Dockerfile
# base image
FROM centos:7
MAINTAINER dot
RUN useradd dot
RUN mkdir dot
ENV envir=test version=1.0
#CMD echo "envir:$envir version:$version"
ENTRYPOINT echo "envir:$envir version:$version"
# base image
FROM centos:7
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html
COPY webroot/ .
RUN useradd -m tomcat -u 1001
USER 1001# docker build -t test:label .
# docker inspect test:label | grep Labels -A 10
"Labels": {
"maintainer": "dot",
"multiple": "true",
"org.label-schema.build-date": "20181006",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"version": "demo"
}
},
...
# base image
FROM centos:7
# MAINTAINER dot # deprecated
LABEL maintainer="dot" version="demo"
LABEL multiple="true"
ARG USERNAME
ARG DIR="defaultValue"
RUN useradd -m $USERNAME -u 1001 && mkdir $DIR
# docker build --build-arg USERNAME="test_arg" -t test:arg .
# docker run -ti --rm test:arg bash
[root@fe7a40927736 /]# ls
bin dev home lib64 media opt root selinux sys usr
defaultValue etc lib lost+found mnt proc sbin srv tmp var
[root@fe7a40927736 /]# tail -1 /etc/passwd
test_arg:x:1001:1001::/home/test_arg:/bin/bash# docker build --no-cache -t centos:user .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos:7
---> d0957ffdf8a2
Step 2/3 : MAINTAINER dot
---> Running in ad0f527d2872
Removing intermediate container ad0f527d2872
---> 422cd518454d
Step 3/3 : RUN useradd dot
---> Running in a50a324f8776
Removing intermediate container a50a324f8776
---> 949582cb3192
Successfully built 949582cb3192
Successfully tagged centos:user
# docker history 949582cb3192
IMAGE CREATED CREATED BY
SIZE
949582cb3192 About an hour ago /bin/sh -c useradd dot
150kB
422cd518454d About an hour ago /bin/sh -c #(nop) MAINTAINER dot
0B
d0957ffdf8a2 17 months ago /bin/sh -c #(nop) CMD ["/bin/bash"]
0B
<missing> 17 months ago /bin/sh -c #(nop) LABEL org.labelschema.sc... 0B
<missing> 17 months ago /bin/sh -c #(nop) ADD
file:0065316a41144e95b... 194MB
<missing> 22 months ago /bin/sh -c #(nop) MAINTAINER# cat Dockerfile
# 构建过程
FROM golang:1.14.4-alpine as builder
WORKDIR /opt
COPY hw.go /opt
RUN go build /opt/hw.go
# CMD "./hw"
# 生成应用镜像过程
FROM alpine:3.12
COPY --from=builder /opt/hw .
CMD [ "./hw" ]apt/yum 在线安装:
清华大学镜像源:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
阿里云镜像源:https://developer.aliyun.com/mirror/docker-ce? spm=a2c6h.13651102.0.0.3e221b11xaRalQ
安装包:
官网下载地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
二进制:
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo curl -L "https://github.com/docker/compose/releases/download/v2.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version# docker volume create nginx-data
# docker volume ls
DRIVER VOLUME NAME
local nginx-data
# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2
4445e4640c74e1c503a7f8c704270abd58c5bc70aacf600e39945f7fd74ac810
# docker exec -it 4445e4640c74 bash
root@4445e4640c74:/# echo "nginx web" > /data/index.html
root@4445e4640c74:/# exit
exit
root@docker-server1:~# ls /var/lib/docker/volumes/nginx-data/_data/index.html
/var/lib/docker/volumes/nginx-data/_data/index.html# docker pull mysql:5.7.38
# docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.38
48e88061e80b9983d0d735f29a176efb810de32f0bd30e12893def798783b9d9
# mysql -uroot -p123456 -h172.31.6.201
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>#root@docker-server1:~# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:d9ff:fe20:16d9 prefixlen 64 scopeid 0x20<link>
ether 02:42:d9:20:16:d9 txqueuelen 0 (Ethernet)
RX packets 1920 bytes 101778 (101.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2203 bytes 16910412 (16.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# root@docker-server1:~# docker network list
NETWORK ID NAME DRIVER SCOPE
438a9be14ef8 bridge bridge local #桥接网络,默认使用的模式,容器基于SNAT进行地址转换访问宿主机以外的环境
4c026356e4d1 host host local #host网络,直接使用宿主机的网络( 不创建net namespace),性能最好,但是容器端口不能冲突
8d70da095b8e none null local #空网络,容器不会分配有效的IP地址(只有一个回环网卡用于内部通信),用于离线数据处理等场
景。# docker run -it -d --name nginx-web1-host-test-container -p 80:80 --net=host nginx:1.20.2
root@docker-server1:~# docker exec -it 0092ca554f bash
root@docker-server1:/# apt update && apt install net-tools
root@docker-server1:/# ifconfig
root@docker-server1:/# netstat -tanlp# docker run -it -d --name nginx-web1-none-test-container -p 80:80 --net=none busybox sleep 10000000
# docker exec -it 3c54e90c209a sh
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping 223.6.6.6
PING 223.6.6.6 (223.6.6.6): 56 data bytes
ping: sendto: Network is unreachable# docker run -it -d --name nginx-container -p 80:80 --net=bridge nginx:1.22.0-alpine
# docker run -it -d --name php-container --net=container:nginx-container php:7.4.30-fpm-alpine
分别进入容器验证IP地址信息
验证net namesapce:
# ls /var/run/netns/netns
# ln -s /var/run/docker/netns/* /var/run/netns/
# ip netns list
default
# ip netns exec 10844980eee7 ip a
72: eth0@if73: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netns default
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever