Docker-安装/概念/打包/运行

2019-05-07

什么是Docker

Docker containers wrap up software and its dependencies into a standardized unit for software development that includes everything it needs to run: code, runtime, system tools and libraries.

Docker是相对于虚拟机更加轻量级的“容器”,直接体现为直接就是一个进程,而和虚拟机一样拥有隔离的运行环境。

事实上Docker是对Linux容器的一种封装,使用时可以看做一个linux虚拟机。

安装Docker

因为我是Deepin,直接下载的Binary File,然后添加一个PATH就行

«https://docs.docker.com/install/linux/docker-ce/binaries/»

启动Docker后台进程(deamon),这是必须的。

$ sudo dockerd &

这样就启动了,可以进行一系列docker操作了~

$ ps -A | grep dockerd
23771 pts/0    00:00:01 dockerd

概念

  • image:

    image是创建一个container的“模板”,根据image和一些参数选项可以创建出一个container,一个image可以创建很多container,即使每个container参数都想相同。

  • container:

    container是可以被docker执行,一个container有其独立的环境和运行状态(比如Running Exited)。

Image

$ sudo docker run hello-world

这条指令创建一个以image文件hello-world为基础的容器实例,并运行。Docker官方的Docker Hub是最常用的image仓库(repository)

对image的其他常用操作:

Usage:	docker image COMMAND

Commands:
build       Build an image from a Dockerfile
ls          List images
pull        Pull an image from repository
push        Push an image to repository
rm          Remove one or more images

很多image都是自己不会停止的,比如一些服务,要终止一个运行的docker进程,就用

$ sudo docker kill <container> #立即杀死进程
$ sudo docker stop <container> #先发个提醒再杀死

创建Image

dockerfile文件是创建image的最重要的配置文件(就是叫做dockerfile的文件),放在打包目录的根目录,官方的例子如下:

# ./Dockerfile

# 从python:2.7-slim这个image继承一个python的runtime
FROM python:2.7-slim

# 把docker的运行目录设置为/app(一般都是这个做法,没什么道理)
WORKDIR /app

# 把当前路径下的所有文件复制进/app(除了dockerignore中标出的)
COPY . /app

# 跑一个pip install的命令安装依赖,没啥好说的
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 暴露出容器的80端口
EXPOSE 80

# 定义一些环境变量
ENV NAME World

# 这个CMD不是windows下的CMD,
# 是指在docker环境下容器启动后默认执行的命令及其参数。
# 可以被docker run命令后的命令行参数替换
# app.py就是python写的一个小程序,没必要看源码,主要是用来说明
CMD ["python", "app.py"]
  • CMDRUN都是执行一条指令,有什么区别呢?
    • RUN在image文件的构建阶段执行,一般用来获得依赖,打包的结果都会COPY
    • CMD是在容器启动后进行的第一条命令,一般用来运行真正的命令
    • 指定了CMD之后如果docker run之后附加了命令,那么就会覆盖掉CMD,这点很重要

同样有一个.dockerignore文件,作用和.gitignore差不多,是设置在image build的时候忽略的文件,比如忽略一个.git就这么写:

.git

写好了配置文件之后就可以运行build了~

$ sudo docker image build --tag=friendlyhello .
  • tag参数可以简写为-t,意思为image的名称
  • .为指定当前目录

Run起来

当一个image已经有了,就是大家最喜欢的run时间,用法为:

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

比如要把我们打包的friendlyhello跑起来,就是这样

$ sudo docker run -p 4000:80 friendlyhello -it /bin/bash
  • -p--publish list的简写,Publish a container’s port(s) to the host的意思,本例中即为把发布到容器80端口(我们EXPOSE的端口)发布到本机的4000端口
  • -i--interactive,Keep STDIN open even if not attached,保持STDIN打开
  • -t--tty, Allocate a pseudo-TTY,监听容器的终端,和-i一起用就是将容器的shell映射到本机,保持一个shell交互状态
  • /bin/bash,还记得docker是一个linux容器吗?它内部也是一个linux的文件目录结构,也有各种linux命令行工具,而/bin/bash意思就是启动bash

其他重要的指令

# 俗话说授人予鱼啥的,--help就是查看帮助
$ docker COMMAND --help

# 一个用run启动的容器实例在停止时不会删除自己,手动rm就完事了
# 或者在docker run加--rm参数
$ docker container rm <container>

# 列出所有的container,包括停止运行的
$ docker container ls -a

# 列出运行的container
$ docker container ps

# 从已有的container中启动,而不是从image创建
$ docker container start <container>

# 正确的停止一个container
$ docker container stop <container>

# 看container的输出
$ docker container log <container>

# 对container运行一个指令
# 本例意思为进入container的shell交互界面
$ docker container exec -it <container> /bin/bash

# 把container中path1目录下的东西复制到本机path2下
$ docker container cp  <container>:<path1> <path2>

其实用--help去查指令就行了,其指令和linux很像,很好记~