关于运维:Docker-基础-1

5次阅读

共计 8073 个字符,预计需要花费 21 分钟才能阅读完成。

镜像

获取镜像

docker pull

查看镜像信息

docker images

docker inspect <images id> # 获取镜像的详细信息

搜查镜像

docker search

删除镜像

docker rmi

当一个镜像领有多个标签,docker rmi 只是删除该镜像指定的标签,并不影响镜像文件
当镜像只剩下一个标签时,再应用会彻底删除该镜像
先删除该镜像的所有容器,再删除镜像

创立镜像

2 种办法:

  • 基于已有镜像的 容器 创立
  • 基于 Dockerfile 创立(举荐)

基于已有镜像的容器创立

docker commit

-a: 作者信息
-m: 提交信息
-p 提交时暂停容器运行
-c changelist

存出和载入镜像

存出sudo docker save -o ubuntu_16.04.tar ubuntu:16.04

载入sudo docker load --input ubuntu_16.04.tar 或者 sudo docker load < ubuntu_16.04.tar

导入镜像,以及其相干的元数据信息(包含标签等)

容器

创立容器

应用交互式来运行容器:sudo docker run -it ubuntu:latest /bin/bash

docker run在后盾执行的规范操作:

  1. 查看本地是否存在指定的镜像,不存在就从私有仓库下载
  2. 利用镜像 创立 启动 一个容器
  3. 调配一个文件系统,并在只读的镜像层里面挂载一层 可读写层
  4. 从宿主主机配置的网桥接口中 桥接 一个虚构接口到容器中去。
  5. 从地址池配置一个 IP 地址 给容器
  6. 执行用户指定的 应用程序
  7. 执行结束后 容器被终止

守护态运行

sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

通过 docker logs 命令获取容器的输入信息:sudo docker -tf logs 2855b4d76ccb

-t: 打印工夫戳
-f: 刷新日志到最初
2855b4d76ccb: 容器 id

终止容器

sudo docker stop 2855b4d76ccb

查看所有容器的信息:sudo docker ps -a

处于终止状态的容器,能够通过 docker start 命令来重新启动:sudo docker start 2855b4d76ccb

重启容器:sudo docker restart 2855b4d76ccb

进入容器

attach 指令

sudo docker attach 2855b4d76ccb

当多个窗口同时 attach 到同一个容器时,所有窗口会同步显示。当某个窗口因命令阻塞时,其余窗口也无奈执行操作。

exec 命令

sudo docker exec -ti 2855b4d76ccb /bin/bash

删除容器

sudo docker rm 2855b4d76ccb

-f 强制删除运行中的容器
-l 删除容器链接,但保留容器
-v 删除容器挂载的数据卷

导入 / 导出容器

导出

sudo docker export 2855b4d76ccb > test.tar

能够将这些文件传输到其余机器上,在其余机器上通过导入命令实现容器迁徙

导入

cat test.tar | sudo docker import - test/ubuntu:v1.0

docker load 导入镜像存储文件到本地的镜像库
docker import 导入一个容器 快照 到本地镜像库

区别:

容器快照 文件将抛弃所有的 历史记录和元数据信息 (仅保留容器过后的快照状态),导入时能够从新指定标签等元数据信息。
镜像存储文件 将保留残缺记录,体积也大。

仓库

Docker Hub

登录

docker login

搜寻

docker search

docker tag

sudo docker tag ubuntu:14.04 10.0.2.2:5000/test

主动创立

步骤:

  1. 登录 Docker Hub, 连贯 GitHub 到 Docker
  2. 在 Docker Hub 中配置主动创立:https://hub.docker.com/add/au…
  3. 选取一个指标网站我的项目(须要含 Dockerfile)和分支
  4. 指定 Dockerfile 的地位,并提交创立
  5. 之后,能够在 Docker Hub 的“主动创立”页面中跟踪每次创立的状态。

创立和应用公有仓库

应用 registry 镜像创立公有仓库

sudo docker -d -p 5000:5000 -v /opt/docker/registry/:/tmp/registry registry

监听端口映射到 5000,docker 容器中的 /tmp/registry 被映射到本地的 /opt/docker/registry/ 上。

治理公有仓库镜像

  • 批改 tag 的 REGISTRYHOST sudo docker tag ubuntu:latest 172.17.0.1:5000/test
  • 应用 docker push 上传 sudo docker push 172.17.0.1:5000/test
  • 应用 docker pull 下载 sudo docker pull 172.17.0.1:5000/test

数据管理

两种形式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volume Containers)

数据卷

个性:

  • 能够在容器间共享和重用
  • 对数据卷的批改会立马失效
  • 对数据卷的更新, 不会影响容器
  • 卷会始终存在, 直到没有容器应用

相似 Linux 的 mount 操作

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

sudo docker run -v /src/webapp:/opt/webapp training/webapp python app.py

加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录.

主机目录必须是绝对路径

默认权限是 读写 (rw), 能够设置为 只读(ro) /src/webapp:/opt/webapp:ro

数据卷容器

数据卷容器 其实就是一般的 容器, 专门用它提供数据卷供其余容器挂载应用.

  1. 创立一个数据卷容器: sudo docker run -it -v /dbdata --name dbdata ubuntu
  2. 在其余容器中应用 volumes-from 来挂载 dbdata 容器中的数据卷.

    
    
    sudo docker run -it --volumes-from dbdata --name db1 ubuntu
    
    
    sudo docker run -it --volumes-from dbdata --name db2 ubuntu
    
    

    3 个容器任何一方在该目录写入, 其余容器都能够看到。
    如果删除了容器, 数据卷 并不会主动删除. 如果要删除数据卷, 必须在删除最初一个挂载着它的容器时显式应用 docker rm -v 命令来指定同时删除关联的容器

利用数据卷容器迁徙数据

备份

sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

复原

sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

网络根底配置

端口映射实现拜访容器

sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

-P: 映射到随机端口

查看端口映射配置

sudo docker port loving_montalcini

容器互联实现容器间通信

容器的连贯 (linking) 零碎, 它会在源和接管容器之间创立一个隧道, 接管容器能够看到源容器指定的信息.

连贯零碎根据容器的名称来执行.

在执行 docker run 的时候如果增加 --rm 标记, 则容器在终止后会立刻删除. --rm-d 无奈同时应用.

容器互联

sudo docker run -d --name db training/postgres  # 创立一个新的数据库容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py  # --link name:alias alias 是连贯的别名

Docker 通过 2 种形式为容器公开连贯信息:

  • 环境变量
  • 更新 /etc/hosts 文件

应用 env 命令查看 web 容器的环境变量:

$ docker exec web env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=62b19d3b5add
DB_PORT=tcp://172.17.0.2:5432
DB_PORT_5432_TCP=tcp://172.17.0.2:5432
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_PG_VERSION=9.3
HOME=/root

/etc/hosts 文件:

$ docker exec web 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.2      db 4288c4f9ad47
 
172.17.0.3      62b19d3b5add  # 本容器

也能够通过 ping 来测试:

$ docker exec web ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.057 ms

应用 Dockerfile 创立镜像

根本构造

  • 根底镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

指令

FROM

第一条指令必须为 FROM 指令

MAINTAINER(已弃用)

制订维护者信息. 当前能够用 LABEL maintainer="CaseyCui cuikaidong@foxmail.com"

RUN

两种格局:

  • RUN <command> bash格局, 命令在 bash 中运行, 默认在 Linux 是 /bin/sh -c 在 windows 上是 cmd /S /C
  • RUN ["executable", "param1", "param2"] (用 docker exec 执行)

每条 RUN 指令将在以后镜像根底上执行指定命令, 并提交为新的镜像.

最佳实际:

apt-get 装置:

RUN apt-get update && apt-get install -y --no-install-recommends \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*

apt-get update && apt-get install 合用

apt-get install -y --no-install-recommends 不装置其余举荐的包, -no-install-suggests 也能够加上

ruby1.9.1 s3cmd=1.1.* 装置指定版本的包

rm -rf /var/lib/apt/lists/* 删除软件包残留

## a few minor docker-specific tweaks
## see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
    \
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
    && echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
    && echo 'exit 101' >> /usr/sbin/policy-rc.d \
    && chmod +x /usr/sbin/policy-rc.d \
    \
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
    && dpkg-divert --local --rename --add /sbin/initctl \
    && cp -a /usr/sbin/policy-rc.d /sbin/initctl \
    && sed -i 's/^exit.*/exit 0/' /sbin/initctl \
    \
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
    && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
    \ 
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
    && echo 'DPkg::Post-Invoke {"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";};' > /etc/apt/apt.conf.d/docker-clean \
    && echo 'APT::Update::Post-Invoke {"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";};' >> /etc/apt/apt.conf.d/docker-clean \
    && echo 'Dir::Cache::pkgcache""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
    \
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
    && echo 'Acquire::Languages"none";' > /etc/apt/apt.conf.d/docker-no-languages \
    \ 
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
    && echo 'Acquire::GzipIndexes"true"; Acquire::CompressionTypes::Order::"gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
    \ 
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
    && echo 'Apt::AutoRemove::SuggestsImportant"false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

set -xe 调试模式, 返回非 0 (即不胜利) 就退出

CMD

反对三种格局:

  • CMD ["executable","param1","param2"] 应用 docker exec 执行, 举荐形式
  • CMD ["param1","param2"] 作为 ENTRYPOINT 的默认参数
  • CMD command param1 param2 bash

指定启动容器时执行的命令, 每个 Dockerfile 只能有一条 CMD 命令.

EXPOSE

EXPOSE 80 8443

裸露的端口号, 供互联零碎应用. 在启动时能够通过 -P-p 来指定映射

ENV

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

举荐 只在 src 为 tar 文件时 (会主动解压) 应用. 其余时候应用 COPY. 不举荐应用 URL 的形式.

COPY

COPY <src> <dest> 当应用本例目录为 src 时, 举荐应用 COPY

ENTRYPOINT

两种格局:

  • ENTRYPOINT ["executable", "param1", "param2"] exec 格局
  • ENTRYPOINT command param1 param2 bash 格局

VOLUME

创立一个能够从本地主机或其余容器挂载的挂载点, 个别用来寄存数据库和须要放弃的数据等.

USER

指定运行容器时的用户名或 UID, 后续的 RUN 也会应用指定用户.

当服务不须要管理员权限时, 能够通过该命令指定运行用户.

要长期获取管理员权限举荐应用 gosu , 不举荐sudo

WORKDIR

为后续的 RUN CMD ENTRYPOINT 指令配置工作目录.

ONBUILD

ONBUILD [Dockerilfe 的指令]

配置当所创立的镜像作为其余新创建镜像的根底镜像时, 所执行的操作指令.

应用 ONBUILD 指令的镜像, 举荐在 tag 中注明, 如 ruby:1.9-onbuild

创立镜像

docker build [选项] 门路

实现:

  1. 读取指定门路下 (包含子目录) 的 Dockerfile
  2. 将该门路下所有内容发送给 Docker 服务端
  3. 由服务端来创立镜像

个别倡议搁置 Dockerfile 的目录为空目录

能够通过 .dockerignore 文件来让 Docker 疏忽门路下的目录和文件.

## comment
*/temp*
*/*/temp*
temp?

指令示例: sudo docker build -t build_repo/first_image /tmp/docker_builder/

三人行, 必有我师; 常识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

正文完
 0