Docker-安装/概念/打包/运行
什么是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"]
CMD
和RUN
都是执行一条指令,有什么区别呢?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很像,很好记~