Docker-速查

Docker使用速查手册

Posted by Silence on May 11, 2020

基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker安装配置

使用镜像

从仓库中获取镜像;管理本地主机上的镜像;

获取镜像

使用命令为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
例子: docker pull ubuntu:18.04

运行镜像

docker run -it --rm \
    ubuntu:16.04 \
    bash

-it

列出镜像

docker image ls
加过滤器:
docker image ls ubuntu
也可以使用-f,配合其他的过滤方式

删除本地镜像

docker image rm [选项] <镜像1> [<镜像2> ...]
指定镜像名可以删除,一般采用镜像短ID来删除
untagged和Deleted有所不同

从容器创建新镜像

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
强烈不建议使用commit,每次修改层的操作会让镜像变得更加臃肿

使用Dockerfile定制镜像

FROM debian:stretch
ENV NODE_VERSION 7.2.0
VOLUME /data
RUN buildDeps='gcc libc6-dev make wget' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.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
COPY hom* /mydir/
COPY hom?.txt /mydir/
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT [ "curl", "-s", "https://ip.cn" ]
HEALTHCHECK --interval=5s --timeout=3s \
  CMD curl -fs http://localhost/ || exit 1

FROM:指定基础基础镜像
RUN:执行命令行命令,每一个RUN都新建一层,有数目限制。要注意在每一层构建后清理掉无关的文件,保证镜像的轻便
COPY:复制文件
ADD:高级COPY,多用于自动解压缩
CMD:用于指定默认的容器主进程的启动命令。如果需要启动某种服务,以CMD ["nginx", "-g", "daemon off;"]来执行
ENTRYPOINT:升级版RUN。把镜像当命令执行、应用运行前的准备工作
ENV:设置环境变量
ARG:构建参数
VOLUME:定义匿名卷,用于保存动态数据,在镜像完整构建完毕后不会被记录
EXPOSE:申明端口
WORKDIR:指定工作目录,在此次操作之后层中生效
USER:指定用户,在此次操作之后层中生效
HEALTHCHECK:告诉 Docker 应该如何进行判断容器的状态是否正常
ONBUILD:当前不生效,为后人准备

构建镜像:

docker build [选项] <上下文路径/URL/->
例子:
docker build -t nginx:v3 .
用给定的tar压缩包构建:
docker build http://server/context.tar.gz

保存镜像

docker save alpine -o filename
一条两台机器间传递镜像,且带进度条:
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'

容器

启动容器

新建并启动:
docker run ubuntu:18.04 /bin/echo 'Hello world' 容器的核心仅为执行的应用程序,所需资源也是程序运行所必须的

后台运行

-d 选项
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看容器信息,获取容器输出信息
docker container ls
docker container log

终止容器

docker container stop

进入容器

attachexec
前一个执行exit会停止容器,后一个通过使用-it选项可以看到Linux命令提示符,exit不会停止容器

导出和导入

导出: docker export 7691a814370e > ubuntu.tar
导入:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

如需删除正在运行的容器,加-f
docker container rm trusting_newton
清理所有处于终止状态的容器
docker container prune

数据管理

介绍如何在Docker内部以及容器间管理数据。主要为:数据卷(Volumes),挂在主机目录(Bind mounts)

数据卷

数据卷是一个供一个或多个容器使用的特殊目录。在容器间共享和重用,修改立即生效,更新不影响镜像,默认一直存在即便容器被删除
创建一个数据卷:
docker volume create my-vol
查看指定数据卷的信息:
docker volume inspect my-vol
删除指定卷的信息:
docker volume rm my-vol

挂载主机目录,文件

docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

Docker中的网络功能介绍

Docker允许通过外部访问容器或容器互联的方式来提供网络服务

外部访问容器

使用-P,Docker会随机映射一个49000-49900的端口到内部容器开放的网络端口
docker run -d -P training/webapp python app.py
使用-p可以自行指定映射端口,一个端口一个容器:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
1.映射所有接口地址
docker run -d -p 5000:5000 training/webapp python app.py
2.映射到指定地址的指定端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
3.映射到指定地址的任意端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py

查看映射端口配置

docker port nostalgic_morse 5000
也可以使用-p一次性指定多个端口

容器互联

新建网络
docker network create -d bridge my-net
连接容器
docker run -it -rm --name busybox1 --network my-net busybox sh

配置DNS