docker基础使用命令手册和操作(附带说明)

安装基本配置

安装

方法1-脚本安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS
系统上可以使用这套脚本安装:

# 在实际过程中get-docker.sh文件可能curl很慢。可以浏览器直接打开get.docker.com,将期复制下来,再创建get-docker.sh,将复制的内容保存进去。
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

方法2-普通命令行安装

# 1、更新update到最新的版本
~ yum update
# 2、卸载老版本docker
~ yum remove docker docker-common docker-selinux docker-engine
# 3、安装需要的软件包
~ yum install -y yum-utils device-mapper-persistent-data lvm2
# 4、设置yum源
~ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 5、查看docker版本
~ yum list docker-ce --showduplicates|sort -r
# 6、安装docker
~ yum install docker-ce-18.03.1.ce -y
# 7、启动docker
~ systemctl start docker
# 8、加入开机自启
~ systemctl enable docker
# 9、配置国内镜像,个人觉得国内镜像用专用的阿里云比较好。可看下方阿里云镜像源获取
~ vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
~ ps -aux | grep docker

设置阿里云镜像

多说无益,直接截图
image.png

dockerhub账户关联

这个有点类似于composer的仓库地址就是用来存储我们开会人员的镜像地址的;
官网:https://hub.docker.com
自己注册一个账号,这个过程我就跳过。

~ docker login
Username: haokeed(对应dockerhub的账号)
Password:
Login Successded

# 异常!
# 在上面执行的代码可能出现如下异常 rror response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifest
# 这个问题的异常主要是
# 1. 解析ip不可用
# 2. 是因为dns域名没有解析的原因;
# 解决:
~ yum install bind-utils
~ dig @114.114.114.114 registry-1.docker.io

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @114.114.114.114 registry-1.docker.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57840
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;registry-1.docker.io. IN A
;; ANSWER SECTION:
registry-1.docker.io. 33 IN A 34.205.88.205
registry-1.docker.io. 33 IN A 35.169.133.189
registry-1.docker.io. 33 IN A 34.202.247.184
registry-1.docker.io. 33 IN A 3.224.11.4
registry-1.docker.io. 33 IN A 3.82.34.201
registry-1.docker.io. 33 IN A 34.195.36.112
registry-1.docker.io. 33 IN A 3.221.133.86
registry-1.docker.io. 33 IN A 3.224.75.242
;; Query time: 26 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 三 4月 22 04:41:31 CST 2020
;; MSG SIZE rcvd: 177

~ vi /etc/hosts
34.205.88.205 registry-1.docker.io
~ systemctl restart docker

登入成功之后,使用push命令就可以上传镜像,如果不指定tag则本地的镜像都会上传。如下实例:
注意docker hub的push要求是如下格式

docker push 注册名/镜像名:tag

可以在https://hub.docker.com的自己...,自己上去看吧。

镜像和容器最常用命令

镜像

# 查看现有的镜像列表
docker images

# 下载镜像
# 这里下载了nginx
docker pull nginx


# 删除镜像
## 指定删除
docker rmi 镜像id(image id)
## 强制删除
docker rmi -f 镜像id(image id)
## 删除所有镜像
docker rmi $(docker images -q)

# 根据dockerfile构建镜像
# redis5:构建的镜像名称
# ".":构建的dockerfile文件目录在当前目录下
docker build -t redis5 .

# 执行tag修改
# 将原来构建镜像名为redis5的修改为haokeed/redis5,并打上tag为v1
docker tag redis5 haokeed/redis5:v1

# 上传docker镜像到dockerhub。执行该命令时,个人建议现在dockerhub上建立对应的仓库。建立好后可以在任何其他地方docker pull haokeed/redis5:v1
docker push haokeed/redis5:v1

使用commit命令创建本地镜像
使用镜像创建并运行一个容器,实际上是在父镜像的基础上创建一个可读写的文件层级。我们在容器里所做的修改(包括安装新的应用程序、更改系统配置),都发生在这个层级上面。下面的一下列命令展示redis5镜
像上创建和运行一个容器,并在该容器上完成redis的安装或者做其他的软件也可以创建一个文件写入 redis5 test docker 等操作。

[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d82c67522964 redis5:v1 "bash" 20 minutes ago Up 20 minutes redis5
[root@localhost /]# docker exec -it redis5 bash
[root@d82c67522964 /]# ls
bin dump.rdb home lib64 media opt root sbin sys usr
dev etc lib lost+found mnt proc run srv tmp var
[root@d82c67522964 /]# echo "hello docker commit" >> hellodocker.txt
[root@d82c67522964 /]# ls
bin etc lib media proc sbin tmp
dev hellodocker.txt lib64 mnt root srv usr
dump.rdb home lost+found opt run sys var
[root@d82c67522964 /]# cat hellodocker.txt
hello docker commit
[root@d82c67522964 /]# exit
exit
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d82c67522964 redis5:v1 "bash" 21 minutes ago Up 21 minutes redis5

# 上面对容器里面的就是在容器里面添加了一个文件,通常情况下的操作都是在容器中安装了应用等的修改。

# 重点来了
# commit命令后,返回一个长的字符串,这个字符串就是刚创建镜像的完整id,这个id也可以通过docker ps -l -q(用于获取最近创建的容器id) 命令得到。 
# 命令中-m参数是描述我们此创建images的信息(--author 参数用来指定
作者信息)
[root@localhost /]# docker commit -m="test commit" d82c67522964 haokeed/redis5:v2
sha256:20036b73669961f3d8fc91a423db91bf24a7d6390edfb5295f5d7ec105b2e405

root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
haokeed/redis5 v2 20036b736699 6 seconds ago 734MB
redis5 v1 42b05d59fa02 13 hours ago 734MB

# 查看对某个镜像修改的历史
[root@localhost /]# docker history haokeed/redis5:v2
IMAGE CREATED CREATED BY SIZE COMMENT
20036b736699 4 minutes ago bash 212B test commit
42b05d59fa02 13 hours ago 734MB Imported from -

容器

容器类型

  • 交互型容器:运行在前台,通常会制定有交互的控制台,可以给容器输入,也可以得到容器的输出。创建该日期的终端被关闭,在容器内部使用exit命令或者调用docker stop 、docker kill命令后,容器会停止运行。
  • 后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,改后台容器也依然存在,只有执行docker stop或者docker kill命令

时候才能够使容器变成停止状态

# 启动容器
docker start 容器名

# 查看容器详细信息
docker inspect redis5

# 查看容器日志
docker logs 容器id或名称

# 删除容器
docker rm 容器名

# 列出正在运行的容器
docker ps

# 显示所有的容器,包括未运行的
docker ps -a

# 停止所容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

# 基于镜像与构建容器
docker run -itd --name 容器名称(自定义) 镜像名称:标识

# docker run 执行语法和参数说明
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="nginx-lb": 为容器指定一个名称;
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    -h "mars": 指定容器的hostname;
    -e username="ritchie": 设置环境变量;
    --env-file=[]: 从指定文件读入环境变量;
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    -m :设置容器使用内存最大值;
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    --link=[]: 添加链接到另一个容器;
    --expose=[]: 开放一个端口或一组端口;
    
# 进入容器
# 这里表示进入容器名称为reids5的容器,并且以bash命令行模式进入
docker exec -it redis5 bash

导出与导入

容器的导出与导入

docker的流行与它对容器的易分享和易移植密不可分。用户不仅可以把容器提交到公共服务器上,还可以将容器导出到本地文件系统中。同样我们也可以讲导出的
容器重新导入到docker运行环境中。docker的导入和导出分别由import命令和export命令完成。

# 导出:将容器名称为redis5的导出,导出的文件为当前目录下的redis.tar,导出的是单个的tar文件
# docker export命令会把容器的文件系统以tar包的格式导出到标准输出,我们将其重定位到目标文件name.tar。将容器保存到本地文件也算是其持久化方式的一种。 
docker export redis5 > redis5.tar

# 容器的导入:我们可以使用docker import命令,导人一个本地的tar包作为镜像。
# 这里将redis5.tar文件导出为redis5:v1镜像。然后就可以通过docker run直接构建镜像了。
docker import redis5.tar redis5:v1

镜像的导出与导入

# 将指定镜像保存成 tar 归档文件
# docker save [OPTIONS] IMAGE [IMAGE...]
# options说明
# -o :输出到的文件。

# haokeed/redis5:v1导出为redis5.tar文件
docker save -o redis5.tar haokeed/redis5:v1

# 将redis5.tar导入镜像
docker load<redis5.tar

save/load(image级)和export/import(container级)的区别

exportimport导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。
你的 dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。而saveload保存的是镜像(image),载入的是镜像包。

  • docker save 保存的是镜像(image),docker export 保存的是容器(container);
  • docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
  • docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。

image.png

Dockerfile语法

dockerfile文件样例:

FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y ; \
yum -y install gcc automake autoconf libtool make wget epel-release gcc-c++;
RUN mkdir -p /usr/src/redis; \
wget https://github.com/antirez/redis/archive/5.0.7.tar.gz; \
tar -zxvf 5.0.7.tar.gz -C /usr/src/redis; \
rm -rf 5.0.7.tar.gz; \
cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install;
# 构建命令
docker build -t 名称 .

# 参数说明
Usage:docker build [OPTIONS] PATH | URL | -
OPTIONS:
    -t ,--tag list  #构建后的镜像名称
    -f, --file string #指定Dockerfiile文件位置

# 示例:
1 docker build .
2 docker build -t redis:v1 .
3 docker build -t redis:v2 -f /path/Dockerfile /path
# 一般常用第2种方式构建,我们在构建时都会切换到Dockerfile文件的目录下进行构建,所以不需要指定-f参

指令参数说明

  • FROM:
    指定待扩展的父级镜像。除了注释外,在文件开头必须是一一个FROM指令, 接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个FROM指令。通过添加多个FROM命令可以在同一个Dockerfile文件中创建多个镜像。
    所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个redis镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
  • RUN:
    RUN 指令是用来执行命令行命令的。
    格式:

    RUN \<command\> (类似/bin/sh -cshell格式)
    RUN ["executable", "param1", "param2"] (exec格式)
    
    # 类似shell脚本风格的:
    FROM alpine
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
    RUN mkdir -p /usr/src/redis
    RUN cd /usr/src/redis
    RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
    RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
    RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
  • MAINTAINER:
    用来声明创建的镜像的作者信息。
    格式为MAINTAINER user_name user_email,指定维护者信息。
  • EXPOSE:
    用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器;或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。
  • ADD:
    向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以是一个文件夹。
  • ENV:
    设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量。
    格式为:EVN key valueENV key=value key2=value ...。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
    例如:
    ENV word hello
    RUN echo $word
  • ARG:
    格式:ARG 参数名[=默认值]
    和ENV一样都是设置环境变量;不同的是ARG锁这是的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要用ARG来保存密码之类的信息,因为docker history还是可以看到所有的值的。
    该默认值可以在构建命令docker build中用--build-arg 参数名=参数值来覆盖。
    注意:1.13之前的版本,--build-arg中的参数名,必须在dockerfile中ARG定义过。1.13版本之后,不是必须,但是会报警告。
  • ADD:
    向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一一个网络文件,也 可以是一个文件夹。
从构建环境的上下文或远程URL复制文件至镜像。如果是从一个本地路径添加一个归档文件,那么它会被自动解压。由于ADD指令涵盖的功能相当广泛,一般最好还是使用相对简单的COPY指令来复制构建环境上下。

文的文件和目录,并用RUN指令配合curl或wget来下载远程资源(这样还可以在同一个指令中处理和删除下载文件)。

ADD命令的第一个参数用来指定源文件 (夹),它可 以是文件路径、文件夹的路径或网络文件的URL地址。需要特别注意的是,如果是文件路径或文件夹路径,它必须是相对Dockerfile所在目录的相对路径。如果是一个文件URL,在创建镜像时,会先下载下来,然后再添加到镜像里去。第二个参数是文件需要放置在目标镜像的位置。如果源文件是gzip、bzip2或者xz形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一一个通过URL指定的网络压缩文件,则不会解压。

  • COPY:
    用于从构建环境的上下文复制文件至镜像。它有两种形式,COPY src dest 以及COPY[ "src","dest"],两者皆从上下文中的sre复制文件或目录至容器内的dest。如果路径中有空格的话,那么必须使用JSON数组的格式。通配符可以用来指定多个文件或目录。请注意,你不能指定上下文以外的srC路径(例如./another di/mnyfile是不管用的)。

    COPY ./conf/nginx.conf /conf
  • CMD与ENTRYPOINT:
    用来设置启动容器时默认运行的命令,当然我们也可以通过指定的方式去覆盖。
    我们在dockerfile中的内容如果是下面的情况:

    FROM alpine
    CMD ["ls", "-a", "-l"]

    如果我们改一下docker run的命令让其执行其他命令
    docker run 构建的镜像名 echo "hello docker"
    可以看到默认的被替换了
    ENTRYPOINT:与CMD类似,它也是用来指定容器启动的时候默认运行的命令

    FROM alpine
    ENTRYPOINT ["ehco ENTRYPOINT"]

    ENTRYPOINT和CMD的区别在于运行容器时添加在镜像名之后的参数,对ENTRYPOINT是拼接,而对于CMD命令则是覆盖。幸运的是,我们在运行容器的时候可以通过 --entrypoint来覆盖dockerfile中的命令

  • EXPOSE:
    用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器或主机就可以通过映射后的端口与此容器通信。

    EXPOSE 6379

    同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。
    注意,expose只是开放端口,运行的时候还需要利用-p绑定到宿主机对应的端口上才能提供给外部网络用。

    # -p 8000:80 是告诉宿主机用户访问8000端口转发至容器80上
    docker run -d -p 8000:80 nginx
  • VOLUME:
    定义匿名券,这个放到下方的"数据卷和数据容器管理数据"中特别说明,请看下方。

比较完全的dockerfile文件内容

FROM centos
RUN mkdir /data && mkdir /conf &&
RUN groupadd -r nginx && useradd -r -g nginx nginx
#修改时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ARG PHP_VERSION=7.2
#添加centos源(先下载wget)
COPY ./epel-7.repo /etc/yum.repos.d/epel.repo
#COPY
#RUN yum install -y wget
#RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum update -y \
&& yum clean all \
&& yum makecache \
&& yum -y install gcc gcc-c++ autoconf automake make zlib zlib-devel net-tools openssl* pcre* wget \
&& yum clean all && rm -rf /var/cache/yum/*
#声明匿名卷
VOLUME /data
RUN cd /data \
&& wget http://nginx.org/download/nginx-1.14.1.tar.gz \
&& tar -zxvf nginx-1.14.1.tar.gz \
&& cd nginx-1.14.1 \
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
&& make && make install && rm -rf /data/nginx-1.14.1.tar.gz && rm -rf /data/nginx-1.14.1
COPY ./conf/nginx.conf /conf
#全局使用nginx,软链接
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin
#进入容器时默认打开的目录
WORKDIR /conf
#声明端口
EXPOSE 80
#容器启动的时候执行,在docker run过程当中是会被其他指令替代
#CMD ["/usr/local/nginx/sbin/nginx","-c","/conf/nginx.conf","-g","daemon off;"]
#执行一条指令
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-c","/conf/nginx.conf","-g","daemon off;"]

注意问题:
镜像过大:我们的系统可能会因为我们的安装的疏忽造成镜像过大的问题。

系统一般在进行yum安装之后会有一个cache的记录
yum命令会下载我们需要安装的软件然后进行缓存到默认的目录(当然这个目录我们是可以指定的)
centos下执行yum install xxx后。
系统会从yum源下载rpm,将rpm放置到缓存目录下: /var/cache/yum/(yum源的不同则下载后存在的路径也有所不同,通常都是存放在packages目录下,如 /var/cache/yum/*/packages。)
需要注意就是yum安装之后这些缓存不一定全部删除了有可能就会有些没有删除
需要做的是手动把这些东西删除

挂载(数据卷和数据容器管理数据)

因为考虑到一个问题就是容器它可能会存在误删的情况,而如果我们的数据都在容器中这就会成为一个很大的问题;docker就提出了一个解决方案,就是共享到宿主机;如docker run -v 挂载数据卷
格式:-v 容器目录 或 -v 本地(宿主机)目录:容器目录

# 根据下面的那个命令我们可以让本地的 /root/docker/redis5v/data 与docker容器中的 /data 地址进行绑定了;就可以在宿主机的/root/docker/redis5v/data和容器中的/data目录中镜像文件和数据同步了。
[root@localhost 02]# docker run -itd --name redis5v -v /root/docker/redis5v/data:/data redis5v

在实际中,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库这类需要保存动态数据的应用,其数据文件应该保存于券(volume)中。在dockerfile中,我们可以实现指定某些目录挂载为匿名券,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。所以,在dockerfile中有了VOLUME参数。

VOLUME:定义匿名券
格式:VOLUME [“路径1”,“路径2”...]VOLUME 路径

# dockerfile中
VOLUME /data

# 这里的/data目录就会在运行时自动挂载为匿名券,任何向/data中写入的信息都不会记录进容器存储层,从而保证了容易存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:
docker run -d -v mydata:/data xxxx
# 在这个命令中,就使用了mydata这个命名券挂载到了/data这个位置,替代了dockerfile中定义的匿名券的挂载配置。如果没有-v填写,docker会创建一个文件记录。

docker inspect -f {{.Mounts}} 容器名称
# 查看匿名挂载在宿主机哪个目录中。

docker网络ip 与 EXPOSE

对于docker里面的容器来说(也就是系统),从系统来看是会独立的网络,同时也会有独立的ip,而如果说外部想要访问的话就需要暴露端口;可以通过dockerfile中EXPOSE参数或者docker run -p的方式。
image.png

docker安装后,默认会创建下面三种网络类型:

[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0a95d66b232f        bridge              bridge              local
8a7a74a01de4        host                host                local
c54cd01dbebf        none                null                local

可在docker run 或其他地方通过--network bridge指定网络类型。

1. bridge:桥接网络

默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变。
image.png
从上面的网络模型可以看出,容器从原理上是可以与宿主机乃至外界的其他机器通信的。同一宿主机上,容器之间都是连接掉docker0这个网桥上的,它可以作 为虚拟交换机使容器可以相互通信。然而, 由于宿主机的IP地址与容器的IP地址均不在同一个网段,不足以使宿主机以外的网络主动发现容器的存在。为了使外界可以方位容器中的进程,docker采用了端口绑定的方式,也就是通过iptables的NAT, 将宿主机上的端口端口流量转发到容器内的端口上。

在宿主机上,可以通过iptables -t nat -L -n,查到一条DNAT规则:
bridge模式的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,对宿主机端口的管理会是一个比较大的问题。同时,由于容 器与外界通信是基于三层上iptables NAT,性能和效率上的损耗是可以预见的。

2.none:无指定网络

无指定网络 使用 --network=none ,docker 容器就不会分配局域网的IP

3. host:互通

主机网络 使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主 机的8080端口就会自动映射到容器中。
image.png
弊端:

1)最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,在生产环境中,这种 问题可能是不被允许的。
2)容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了

4. 指定自定义网络

因为默认的网络不能制定固定的地址,所以我们将创建自定义网络,并指定网段:192.168.1.0/24 并命名为mynetwork,指令
如下:

# 创建自定义网络,并设置网段为:192.160.1.0/24,名称为:mynetwork
~ docker network create --subnet=192.160.1.0/24 mynetwork
# 将网络配置分配给即将运行的容器,使用的网段名称为:mynetwork,指定容器ip为192.168.1.10
~ docker run -itd --network=mynetwork --ip 192.168.1.10 --name dockerName imagesName
# 查看当前的所有网络
~ docker network ls
# 移除自定义网络,移除的名称为mynetwork
~ docker network rm mynetwork

!注意:这个网络段不要和宿主机的网络端冲突,不然会容易对宿主机产生影响

阅读 544

推荐阅读