目录
基本概念
定义
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
-
docker port:可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
-
启动后添加端口追加端口映射
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
常用命令
-
COPY/ADD
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
-
ENTRYPOINT
-
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
-
在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
-
-
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
-
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
-
CMD/RUN
-
CMD 在docker run 时运行。
-
RUN 是在 docker build。
-
-
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 命令来启动并运行整个应用程序。
相关命令
-
version
指定本 yml 依从的 compose 哪个版本制定的
-
build
指定为构建镜像上下文路径
-
dns
自定义 DNS 服务器,可以是单个值或列表的多个值
-
image
指定容器运行的镜像
-
volumes
将主机的数据卷或着文件挂载到容器里
-
container_name
指定自定义容器名称,而不是生成的默认名称
-
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
-
使用alpine3.9作为基础镜像构建go程序时, 出现Standard_init_linux.go:175 exec user process caused no such file
运行在alpine3.9的go程序,涉及到动态编译与静态编译的问题,在alpine3.6上应该使用网络编译go,即增加 -tags netgo