Docker

目录


基本概念


定义

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化

组件

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

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

  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像

容器与镜像的关系类似于面向对象编程中的对象与类

安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

镜像


镜像列表

docker images

获取镜像

docker pull [ubuntu:15.10]

查找镜像

docker search httpd

删除镜像

 docker rmi [ubuntu:15.10]

构建镜像

docker build

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

导出镜像

docker commit

容器


查看容器

docker ps # 运行的容器
docker ps -a  # 所有容器

启动容器,并以命令行参数进入

$ docker run -it ubuntu /bin/bash
$ docker run -itd --name ubuntu-test ubuntu /bin/bash

  • -t:在新容器内指定一个伪终端或终端

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互

  • -d:后台运行模式

  • -e:指定容器的环境变量

  • —name:指定容器名称

docker run —name kinaba -e ELASTICSEARCH_URL=http://127.0.0.1:9200
docker run -p 3306:3306 --name myMysql -e MYSQL_ROOT_PASSWORD=123456  -d mysql:5.7

  • -v:映射容器文件夹到宿主机

    docker run -it -v /test:/soft centos /bin/bash
    
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

退出容器

  • exit 命令

  • 使用 CTRL+D 来退出容器

停止容器

docker stop <容器 ID>

启动容器

docker start <容器 ID>
docker restart <容器 ID>

进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

docker attach #退出会导致容器停止
docker exec #推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

导出容器

docker export 1e560fca3906 > ubuntu.tar

导入容器

docker import - test/ubuntu:v1
docker import [http://example.com/exampleimage.tgz](http://example.com/exampleimage.tgz) example/imagerepo

删除容器

删除容器使用 docker rm 命令:

docker rm -f 1e560fca3906

端口映射

 docker run -d -p 5000:5000 training/webapp python app.py
  • -P:将容器内部使用的网络端口随机映射到我们使用的主机上
docker port bf08b7f2cd89

Dockerfile


Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

常用命令

  1. COPY/ADD

    复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

  2. ENTRYPOINT

    1. 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

    2. 在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

  3. ENV

    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

  4. WORKDIR

    指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

  5. CMD/RUN

    • CMD 在docker run 时运行。

    • RUN 是在 docker build。

  6. FORM

    定制的镜像都是基于 FROM 的镜像

示例

FROM alpine

ENV PATH /root/dockerTest:$PATH

WORKDIR /root/dockerTest/
COPY dockerTest /root/dockerTest/

ENTRYPOINT ["./dockerTest"]

运行

docker build -t nginx:v3 .

. 是上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

Compose


Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

相关命令

  1. version

    指定本 yml 依从的 compose 哪个版本制定的

  2. build

    指定为构建镜像上下文路径

  3. dns

    自定义 DNS 服务器,可以是单个值或列表的多个值

  4. image

    指定容器运行的镜像

  5. volumes

    将主机的数据卷或着文件挂载到容器里

  6. container_name

    指定自定义容器名称,而不是生成的默认名称

  7. ports

    指定端口与物理机之间的映射关系

示例

version: '3.7'
services:
  dockerTest:
    container_name: dockerTest
    build: ./
    image: docker-tt
    ports:
      - "8088:8088"
    volumes:
      - /root/dockerTest/web/:/root/dockerTest/web/

运行

docker-compose up -d

FQA


  1. 使用alpine3.9作为基础镜像构建go程序时, 出现Standard_init_linux.go:175 exec user process caused no such file

    运行在alpine3.9的go程序,涉及到动态编译与静态编译的问题,在alpine3.6上应该使用网络编译go,即增加 -tags netgo

posted @ 2022-10-07 09:56  cclever  阅读(67)  评论(0)    收藏  举报