docker容器(代码片段)

水月情缘雪飞飞 水月情缘雪飞飞     2023-01-29     731

关键词:

@[TOC]Docker 容器

容器简介

资源推荐

Docker — 从入门到实践

github: https://github.com/yeasy/docker_practice

非常详细的 Docker 学习笔记

docker-image container 基本操作 -常用命令

CENTOS:Docker安装centos容器

基本概念

Docker 镜像(Image)

是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

Docker 容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

Docker 仓库 (Repository)

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

容器安装,加速器配置

1.安装

Docker 官网

Docker Mac

  • 选择平台1:配备英特尔芯片的 Mac
  • 选择平台2:配备 Apple 芯片的 Mac

Docker Windows

  • 安装方式1:WSL 2 后端
  • 安装方式2: Hyper-V 后端和 Windows 容器
  • 注意:部分操作命令需要在前面加 winpty 参数。例如: winpty docker exec -it php bash

Docker Linux

加速器镜像源

阿里云加速器

镜像简介与操作

获取镜像

格式: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

命令详解: docker pull --help
示例: docker pull centos

列出镜像

docker image ls

REPOSITORYTAGIMAGE IDCREATEDSIZE
仓库名标签镜像ID创建时间所占用的空间
nginxlatest08b152afcfae3 months ago133MB
php8d88df285a5d96 months ago423MB

镜像体积

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         2         555.8MB   0B (0%)
Containers      2         0         248.4MB   248.4MB (100%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

虚悬镜像

备注:由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名为none的虚悬镜像

$  docker image ls -f dangling=true
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

docker image prune 命令删除

中间层镜像

简介:为了加速镜像构建、重复利用资源

$ docker image ls -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    08b152afcfae   3 months ago   133MB
php          8         d88df285a5d9   6 months ago   423MB

列出部分镜像(查找过滤)

# 根据仓库名列出镜像: 
$ docker image ls ubuntu
# 指定仓库名和标签:
$ docker image ls ubuntu:18.04
# 滤器参数 --filter,或者简写 -f
$ docker image ls -f since=mongo:3.2

以特定格式显示

$ docker image ls -q
08b152afcfae
d88df285a5d9

删除本地镜像

$ docker image rm [选项] <镜像1> [<镜像2> …]

$ docker image rm centos
Untagged: centos:latest
Untagged: centos@sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Deleted: sha256:0584b3d2cf6d235ee310cf14b54667d889887b838d3f3d3033acd70fc3c48b8a
Deleted: sha256:97ca462ad9eeae25941546209454496e1d66749d53dfa2ee32bf1faabd239d38

# 用 docker image ls 命令来配合
$ docker image rm $(docker image ls -q redis)
$ docker image rm $(docker image ls -q -f before=mongo:3.2)

利用commits镜像构成(不建议使用)

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

docker commit \\
    --author "Tao Wang <twang2218@gmail.com>" \\
    --message "修改了默认网页" \\
    webserver \\
    nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

不建议使用

  • docker diff webserver 仅修改一个文件但是还有很多文件被改动或添加了
  • 所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知,不利于维护。

镜像的实现原理

从 rootfs 压缩包导入

docker import [选项] <文件>||- [<仓库名>[:<标签>]]

docker import \\
    http://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz \\
    openvz/ubuntu:16.04

Docker 镜像的导入和导出 docker save 和 docker load

保存镜像 docker save [镜像名] -o [文件名]

导入镜像 docker load -i [文件名]

# 保存
$ docker save alpine -o filename
$ docker save alpine | gzip > alpine-latest.tar.gz
# 导入
$ docker load -i alpine-latest.tar.gz
Loaded image: alpine:latest

容器简介与操作

容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

启动容器

新建并启动

docker run

  • -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
  • -i 则让容器的标准输入保持打开。

创建容器时,Docker 在后台运行的标准操作包括

  • 检查本地是否存在指定的镜像,不存在就从 registry 下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止容器

docker start 容器id

docker ps -a # 查看本地所有运行的容器
docker ps        # 产看正在运行的容器
docker start 容器id # 运行容器
docker rm 容器id    # 移出容器

# 查看已停止的容器
$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS                NAMES
c737e7f64e1e   php:8          "docker-php-entrypoi…"   About a minute ago   Exited (0) About a minute ago                        vigilant_mestorf
618c48f1da0f   php:8          "docker-php-entrypoi…"   3 months ago         Exited (255) 6 weeks ago                             php8
2a3ed72f7494   nginx:latest   "/docker-entrypoint.…"   3 months ago         Exited (255) 6 weeks ago        0.0.0.0:80->80/tcp   nginx

$ docker start 618c48f1da0f
618c48f1da0f

后台运行

dockr run -d Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下,使用 -d 参数

# 当前宿主机展示
docker run ubuntu:18.04 bash -c "echo 'hello docker'"
hello world
# 后台运行
$  docker run -d ubuntu:18.04 bash -c "echo 'hello docker'"
01f0167632b96fc24dd161dbb6279bc66b19397dd6903a358a2b231633dcceff
# docker logs 查看输出
$ docker logs 01f0167632b96fc24dd161dbb6279bc66b19397dd6903a358a2b231633dcceff
hello docker

终止容器 docker stop 容器id

docker stop 容器id|NAMES

# 查看正在运行的容器
$ docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS     NAMES
f1c29da395fe   ubuntu:18.04   "bash -c 'while true…"   6 minutes ago   Up 6 minutes              brave_blackburn
9527df056d90   ubuntu:18.04   "bash -c 'while true…"   8 minutes ago   Up 8 minutes              romantic_ardinghelli
618c48f1da0f   php:8          "docker-php-entrypoi…"   3 months ago    Up 13 minutes             php8
# 容器id 停止容器运行
$ docker stop f1c29da395fe
f1c29da395fe
# 容器name 停止容器运行
$ docker stop romantic_ardinghelli
romantic_ardinghelli

进入容器

attach 在容器运行结束后会被停止,而exec不会,推荐使用exec

attach

$ docker run -dit ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pulling fs layer
7b1a6ab2e44d: Verifying Checksum
7b1a6ab2e44d: Download complete
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
e896fc8f7f11f6bd2a493531b6ab6ed40420f8284c17bde74dc36f0cb78760dd
$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
e896fc8f7f11   ubuntu    "bash"                   28 seconds ago   Up 26 seconds             musing_lumiere
618c48f1da0f   php:8     "docker-php-entrypoi…"   3 months ago     Up 19 minutes             php8
$ docker attach musing_lumiere
root@e896fc8f7f11:/# exit 
# 命令行如果退出则容器也会停止

exec 推荐使用

docker exec -i 容器id|names bash

  • -i 分配一个伪终端
  • 进入容器后不会随终端的退出而导致容器的停止
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS          PORTS     NAMES
618c48f1da0f   php:8     "docker-php-entrypoi…"   3 months ago   Up 23 minutes             php8
$ docker exec -i 618c48f1da0f bash
$ exit  # 终端 exet
$ docker ps  # 查看正在运行的容器,发现php:8依然在运行
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS          PORTS     NAMES
618c48f1da0f   php:8     "docker-php-entrypoi…"   3 months ago   Up 25 minutes             php8

导出和导入容器

导出容器(导出容器快照到本地文件)

docker export

$ docker container ls -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                        PORTS                NAMES
e896fc8f7f11   ubuntu         "bash"                   14 minutes ago   Exited (0) 11 minutes ago                          musing_lumiere
# 导出容器到本地
$ docker export e896fc8f7f11 > ubuntu.tar

导入容器快照(容器快照文件中再导入为镜像)

docker import 文件导入和远程网址导入

# 文件导入
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
sha256:a4bf755ec36a1ce5794ec3d2ff43dbbe2e9b37c8ddf0a6e583002702e0ceddd2
# 查看导入的景象
$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
test/ubuntu   v1.0      a4bf755ec36a   25 seconds ago   72.8MB
# 远程网址导入
$ docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

docker rm 停止状态容器的id

docker container prune (清理所有处于终止状态的容器)

$ docker rm e896fc8f7f11
e896fc8f7f11
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
7a7d3e5d4eb2bdcfadae02dacb8a75960398352eb59133dd43823e80cf483c74
01f0167632b96fc24dd161dbb6279bc66b19397dd6903a358a2b231633dcceff
f1c29da395fe59875dac98055140101a24147e28bb04cd0a0a88c6b3dbd90323
9527df056d90ecf50e13ee671330c0341eb9f60543b8ace762b850970c652d05
8df0d2994b05def934a29eb43a4f095a13928fc0f3ee8b34da807e7e1da4160d
c737e7f64e1e80053b8b8cec73fa6ef39dfa4f868cff83fa223e78f2c5536021
2a3ed72f7494f69148a377f668216a0a8080c18786441978844c9ccb67125066

Total reclaimed space: 154.5MB

Dockerfile 指令详解

构建命令: docker build -t [NAME]:[TAG] -f Dockerfile .

COPY 复制文件

  • COPY [–chown=:] <源路径>… <目标路径>
  • COPY [–chown=:] ["<源路径1>",… “<目标路径>”]

ADD 更高级的复制文件

  • ADD 源路径 目标路径 (拥有解压缩的功能,建议使用wget curl工具下载后解压)

CMD 容器启动命令

  • shell 格式:CMD <命令>
  • exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
  • 参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT 入口点

  • 场景一:让镜像变成像命令一样使用
docker run myip curl -s http://myip.ipip.net -i
# 改变成下面的ENTRYPOINT
FROM ubuntu:18.04
RUN apt-get update \\
&& apt-get install -y curl \\
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net"]
  • 场景二:应用运行前的准备工作
FROM alpine:3.4
...
RUN addgroup -S redis && adduser -S -G redis redis
...
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD [ "redis-server" ]

ENV 设置环境变量

  • ENV
  • ENV <key1>=<value1> <key2>=<value2>…
ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \\
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \\
  && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \\
  && grep " node-v$NODE_VERSION-linux-x64.tar.xz\\$" SHASUMS256.txt | sha256sum -c - \\
  && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \\
  && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \\
  && ln -s /usr/local/bin/node /usr/local/bin/nodejs

ARG 构建参数

  • ARG <参数名>[=<默认值>]

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。

VOLUME 定义匿名卷

  • VOLUME ["<路径1>", “<路径2>”…]
  • VOLUME <路径>

为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

VOLUME /data

EXPOSE 声明端口

  • EXPOSE <端口1> [<端口2>…]

声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务

指定端口: -p <宿主端口>:<容器端口>

WORKDIR 指定工作目录

  • WORKDIR <工作目录路径>

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。

USER 指定当前用户

  • USER <用户名>[:<用户组>]

USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。

HEALTHCHECK 健康检查

  • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
  • HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

LABEL 指令

  • LABEL <key>=<value> <key>=<value> <key>=<value> …

SHELL 指令

  • SHELL [“executable”, “parameters”]

ONBUILD 以当前镜像为基础镜像去构建其它镜像

  • ONBUILD <其它指令>

在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

这次我们回到原始的 Dockerfile,但是这次将项目相关的指令加上 ONBUILD,这样在构建基础镜像的时候,这三行并不会被执行。然后各个项目的 Dockerfile 就变成了简单地

FROM my-node

参考文档

Dockerfie 官方文档:https://docs.docker.com/engine/reference/builder/
Dockerfile 最佳实践文档:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Docker 官方镜像 Dockerfile:https://github.com/docker-library/docs

多阶段构建

全部放入一个 Dockerfile,

  • 镜像层次多,镜像体积较大,部署时间变长
  • 源代码存在泄露的风险
FROM golang:alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest as prod
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloworld/app .
CMD ["./app"]
# 构建镜像
 docker build -t go/helloworld:3 .
 # 对比三个镜像大小
 $ docker image ls
REPOSITORY        TAG   IMAGE ID         CREATED            SIZE
go/helloworld     3     d6911ed9c846     7 seconds ago      6.47MB
go/helloworld     2     f7cf3465432c     22 seconds ago     6.47MB
go/helloworld     1     f55d3e16affc     2 minutes ago      295MB

示例

FROM centos:7
MAINTAINER Fisher "1837737522@qq.com"

# docker build -t centos:php73 -f php73_Dockerfile .

# 编译安装php73版本

# 声明 docker 地址变量
ARG DOCKER=/docker
# php 构建版本
ARG PHP_VERSION=php73

# 解压
COPY config $DOCKER/config
COPY php $DOCKER/php
COPY nginx $DOCKER/nginx

RUN set -e \\
cd $DOCKER \\
# 系统初始化
&& cd $DOCKER/config/ \\
&& chmod +x system_init.sh && ./system_init.sh \\
# php 安装
&& cd $DOCKER/php/$PHP_VERSION && chmod +x install.sh && ./install.sh \\
# nginx 安装
&& cd $DOCKER/nginx/ && chmod +x install.sh && ./install.sh \\
&& chmod +x $DOCKER/config/system_php_start.sh
# 删除无用数据
# && cd / && rm -rf $DOCKER

# 声明端口
EXPOSE 80 443

# 启动 systemctl ,在cmd 或者 run 后面加入 /usr/sbin/init ,不能再加其他的shell命令
# 启用 systemctl 程序无需设置前台运行,依然保证容器不退出。(容器运行 1:程序设置前台运行  2 启用 systemctl,程序无需前台运行)
CMD ["/usr/sbin/init"]

# linux 运行
# 线上
# docker run --name php -d --privileged=true -p 80:80 -p 443:443 registry.cn-beijing.aliyuncs.com/modongxiao/docker:php73
# 本地
# docker run --name php -d --privileged=true -p 81:80 -p 443:443 -v /mvc:/mvc -v /alidata:/alidata -v /web:/web registry.cn-beijing.aliyuncs.com/modongxiao/docker:php73
# 本地原始
# docker run --name php -d --privileged=true -p 81:80 -p 443:443 -v /mvc:/mvc -v /alidata:/alidata -v /web:/web centos:php73

# windows 启动路径方式
# winpty docker run  --name php -d --privileged=true -ti  -p 80:80 -p 443:443  -v D:\\\\mvc:/mvc -v D:\\\\alidata:/alidata -v D:\\\\web:/web   registry.cn-beijing.aliyuncs.com/modongxiao/docker:php73 init

仓库管理

是集中存放镜像的地方

镜像仓库:

构建镜像:

使用镜像:

数据管理

数据卷(Volumes)

数据卷 是一个可供一个或多个容器使用的特殊目录

  • 数据卷 可以在容器之间共享和重用
  • 对 数据卷 的修改会立马生效
  • 对 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

创建一个数据卷

docker volume create [NAME]

$ docker volume create my-vol
# 查看所有的 数据卷
$ docker volume ls
DRIVER    VOLUME NAME
local     my-vol

启动一个挂载数据卷的容器

在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷。

$ docker run -d -P \\
    --name web \\
    # -v my-vol:/usr/share/nginx/html \\
    --mount source=my-vol,target=/usr/share/nginx/html \\
    nginx:alpine

查看数据卷的具体信息

docker inspect [卷名]

$ docker inspect  my-vol
[
    
        "CreatedAt": "2021-11-07T07:46:12Z",
        "Driver": "local",
        "Labels": ,
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": ,
        "Scope": "local"
    
]

删除数据卷

docker volume rm [卷名]

删除容器的同时移除数据卷,docker rm -v

docker volume prune # 无主的数据卷清理

挂载主机目录 (Bind mounts)

挂载一个主机目录作为数据卷

–mount 标记可以指定挂载一个本地主机的目录到容器中去。

 docker run -d -P \\
    --name web \\
    # -v /src/webapp:/usr/share/nginx/html \\
    --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \\
    nginx:alpine

readonly 只读

$ docker run -d -P \\
    --name web \\
    # -v /src/webapp:/usr/share/nginx/html:ro \\
    --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly \\
    nginx:alpine

挂载一个本地主机文件作为数据卷

$ docker run --rm -it \\
   # -v $HOME/.bash_history:/root/.bash_history \\
   --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \\
   ubuntu:18.04 \\
   bash

root@2affd44b4667:/# history
1  ls
2  diskutil list

使用网络

外部访问容器

  • -P 或 -p 参数来指定端口映射,
  • -P 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口
  • -p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
 docker run -d -P nginx:alpine
 $ docker container ls -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
fae320d08268        nginx:alpine        "/docker-entrypoint.…"   24 seconds ago      Up 20 seconds 
  • 映射所有接口地址 hostPort:containerPort
docker run -d -p 80:80 nginx:alpine
  • 映射到指定地址的指定端口 ip:hostPort:containerPort
$ docker run -d -p 127.0.0.1:80:80 nginx:alpine
  • 映射到指定地址的任意端口 ip::containerPort
$ docker run -d -p 127.0.0.1::80 nginx:alpine
# 使用 udp 标记来指定 udp 端口
$ docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
  • 查看映射端口配置 docker port
$ docker port fa 80
0.0.0.0:32768
  • 多次指定端口
$ docker run -d \\
    -p 80:80 \\
    -p 443:443 \\
    nginx:alpine

容器互联

新建网络

docker network create -d bridge [网络名]

docker network ls # 查看网络

连接容器

# 创建网络
docker network create -d bridge my-net
# 列出所有网络
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2b2da88f6307   bridge    bridge    local
c426cb16f1ba   host      host      local
b63cf9acb121   my-net    bridge    local
642abd8a74a7   none      null      local
# 下载centos镜像
docker pull centos
# 新的终端
 docker run -it --rm --name centos01 --network my-net centos bash
# 新的终端
 docker run -it --rm --name centos02 --network my-net centos bash
 
 # 容器列表
docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
296a215ab471   centos    "bash"                   18 seconds ago   Up 16 seconds             centos02
4f546527fae1   centos    "bash"                   42 seconds ago   Up 38 seconds             centos01

 # 在 centos01 容器中 ping centos02
 [root@4f546527fae1 /]# ping centos02
PING centos02 (172.18.0.3) 56(84) bytes of data.
64 bytes from centos02.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from centos02.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.044 ms
 # 在 centos02 容器中 ping centos01
 [root@296a215ab471 /]# ping centos01
PING centos01 (172.18.0.2) 56(84) bytes of data.
64 bytes from centos01.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.180 ms
64 bytes from centos01.my-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.053 ms

# 查看hosts
[root@296a215ab471 /]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3      296a215ab471

配置 DNS

  • mount 看到挂载信息
$ mount
C:/Program Files/Git on / type ntfs (binary,noacl,auto)
C:/Program Files/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C:/Users/水月情~1/AppData/Local/Temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
D: on /d type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type ntfs (binary,noacl,posix=0,user,noumount,auto)
  • 配置全部容器的dns
/etc/docker/daemon.json

  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]

# 在容器内部 /etc/resolv.conf 可以看到dns
$  docker run -it --rm centos  cat etc/resolv.conf
# DNS requests are forwarded to the host. DHCP DNS options are ignored.
nameserver 192.168.65.5
  • 手动指定容器配置
  1. -h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。
  2. –dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
  3. –dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

docker run --lisk (已废弃,建议使用network)

就很可能还在用默认桥接网络,这很不安全,所有容器都没有适度隔离,用自定义网络才比较方便互联隔离。

# 下载镜像
docker pull centos
# centos 使用 ip add 查看本地地址信息

# 建立第一个容器 (终端1)
 docker run -it --rm --name centos01 centos bash
 
 # 建立第二个容器(终端2)
docker run  -d  -it --rm --name centos02 --link centos01 centos  bash

# 进入容器1
docker exec -it centos01 bash
[root@941828a74821 /]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      941828a74821
[root@941828a74821 /]# ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.039 ms

# 进入容器2
docker exec -it centos02 bash
[root@af7440908cb3 /]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      centos01 941828a74821
172.17.0.4      af7440908cb3
[root@af7440908cb3 /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.066 ms

Docker help帮助文档

$ docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default
                           "C:\\\\Users\\\\水月情缘~雪飞飞\\\\.docker")
  -c, --context string     Name of the context to use to connect to the
                           daemon (overrides DOCKER_HOST env var and
                           default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level
                           ("debug"|"info"|"warn"|"error"|"fatal")
                           (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default
                           "C:\\\\Users\\\\水月情缘~雪飞飞\\\\.docker\\\\ca.pem")
      --tlscert string     Path to TLS certificate file (default
                           "C:\\\\Users\\\\水月情缘~雪飞飞\\\\.docker\\\\cert.pem")
      --tlskey string      Path to TLS key file (default
                           "C:\\\\Users\\\\水月情缘~雪飞飞\\\\.docker\\\\key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  buildx*     Build with BuildKit (Docker Inc., v0.5.1-docker)
  compose*    Docker Compose (Docker Inc., 2.0.0-beta.4)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  scan*       Docker Scan (Docker Inc., v0.8.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a 查看详情  

docker学习笔记——docker管理容器(代码片段)

文章目录Docker管理容器1.容器&镜像&仓库&daemon&client之间的关系2.启动容器3.dockerdaemon管理4.docker命令行5.docker命令行实现容器管理搜索镜像(dockerhub)获取镜像(pull)打包传输镜像启动容器解决docker中的CtenOS8镜像无法使用yum... 查看详情

docker容器管理总结(代码片段)

Docker容器管理总结一、Docker容器理解1.Docker的核心概念2.容器的运行状态二、Dockerfile理解三、容器使用及操作1.进入容器空间内2.后台运行容器3.前台运行容器(针对宿主机)①前台运行容器②新开终端查看容器状态③访问... 查看详情

docker容器学习整理(代码片段)

一、使用Docker镜像1.1docker常用命令1.2创建镜像1.3存出和载入镜像1.4上传镜像二、操作docker容器2.1创建容器2.2终止容器2.3进入容器2.4删除容器2.5导入和导出容器三、访问Docker仓库一、docker基本管理1.1docker常用命令1.1.1dockerimages#列出... 查看详情

docker容器技术基础入门(代码片段)

docker容器技术基础入门容器(Container)传统虚拟化与容器的区别:LinuxNamespacesCGroupsLXCdocker基本概念docker工作方式docker容器编排容器(Container)容器是一种基础工具;泛指任何可以用于容纳其他物品的工具,可以部分或完全封闭... 查看详情

docker容器-容器操作(代码片段)

操作Docker容器1、容器:1.1、容器是Docker的另一个核心概念。简单来说,容器是镜像的一个实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。1.2、如果认... 查看详情

docker05docker容器(代码片段)

目录[TOC]参考书目:黄靖钧.Docker从入门到实战[M].机械工业出版社,2017.一、容器的概念        Docker容器是镜像的运行实例。容器在镜像已有的文件层添加一层可读可写的文件层,使得容器就像是一个... 查看详情

docker容器操作容器(代码片段)

Docker架构(二)容器操作容器是Docker的令一个可行概念,容器就是镜像的运行实例,是独立运行的一个或一组应用(1)Docker容器的创建和启动容器创建就是镜像加载过程命令格式:dockercreate[选项]镜像运行程序[[email protected]~... 查看详情

docker容器入门(代码片段)

目录前言一、Docker概述1.1Docker是什么?1.2Docker设计宗旨Docker与虚拟机的区别(重点)Linux的六大命令空间namespacesdocker和openstack的区别1.3Docker核心概念镜像容器仓库1.4文件系统(Docker架构)二、安装Docker三、Docker相关... 查看详情

docker查看容器挂载目录(代码片段)

dockerinspect容器ID 查看详情

docker常用命令(代码片段)

docker的常用命令帮助命令镜像命令查看镜像搜索镜像下载镜像删除镜像容器命令新建容器并启动列出所有运行的容器退出容器删除容器启动和停止容器的操作查看容器中的进程信息查看镜像的元数据进入当前正在运行的容器将容... 查看详情

docker常用命令(代码片段)

docker的常用命令帮助命令镜像命令查看镜像搜索镜像下载镜像删除镜像容器命令新建容器并启动列出所有运行的容器退出容器删除容器启动和停止容器的操作查看容器中的进程信息查看镜像的元数据进入当前正在运行的容器将容... 查看详情

docker使用-容器(代码片段)

查看容器命令:docker ps [options]options有:-a:查看所有容器,包含不在运行中的(不带-a参数,是只显示运行中的容器)-q:只显示容器ID-s:多加一列来显示总文件大小-l:显示最近创建的容器(docker ps -l)-n:显示... 查看详情

删除所有的docker容器和镜像(代码片段)

目录一、查看docker中所有的容器和镜像二、停止所有docker容器并删除三、删除容器中所有的镜像四、查看docker容器即镜像是否被删除一、查看docker中所有的容器和镜像1、查看所有的容器信息[root@CentOS-1sysadm]#dockerps2、查看所有... 查看详情

docker容器资源限制(代码片段)

背景在使用docker运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那... 查看详情

docker容器的迁移(代码片段)

Docker容器的迁移一、容器的迁移准备1.查看需要迁移的容器2.导出容器成镜像3.查看导出的镜像文件二、导入容器的镜像文件1.将打包的镜像文件导入到新服务器2.查看导入的镜像三、启动迁移后的容器一、容器的迁移准备1.查看需... 查看详情

docker容器(代码片段)

...动,另外一个是将在终止状态的容器重新启动。新建启动dockerrun常用选项:-t:选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上-i:则让容器的标准输入保持打开-d:以后台方式启动容器例如启动一个centos容器... 查看详情

docker简介(代码片段)

Docker系列一一、Docker简介1、Docker特点2、Docker架构3、Docker核心二、Linuxkernel1、Namespace2、Cgroups3、UnionFS三、Docker使用1、Docker安装2、Docker镜像管理1.查看镜像详情2.镜像导入导出3.更改镜像信息4.删除本地镜像3、Docker容器操作1.创建... 查看详情