伏雨朝寒悉不胜,那能还傍杏花行。去年高摘斗轻盈。漫惹炉烟双袖紫,空将酒晕一衫青。人间何处问多情。 ———— 纳兰容若
Docker是一个比VMWare、KVM等“大型虚拟机”更节省资源的创建“虚拟操作系统”的方法。
- 传统部署:在统一硬件条件下拥有一个全新的操作系统,在该操作系统下部署各个APP。
- 虚拟化部署:在统一硬件条件下拥有一个全新的操作系统,在该操作系统下执行虚拟化操作,虚拟出两个全新虚拟机,在各个虚拟机中虚拟出全新的操作系统,再在这个虚拟出来的操作系统中部署APP。对于各个虚拟环境来说,他是一个完全隔离的环境,包括操作系统的内核等。
- 容器化部署:在统一的硬件条件下拥有一个全新的操作系统,在该操作系统中运行了容器服务,在容器中直接虚拟化多个子容器,各个容器中运行各个APP,“省去了操作系统的步骤”。对于容器来说,没有内核说法,用的是宿主机的内核。相较于虚拟化部署来说更节省资源。
一些常用命令
命令 | 作用 |
---|---|
docker images | 查看所有本地镜像 |
docker search * | 在DockerHub中搜索某个镜像 |
docker pull * | 向DockerHub拉取(下载)某个镜像 |
docker pull *:1.0.0 | 向DockerHub拉取(下载)某个镜像的1.0.0版本 |
docker ps | 查看目前正在运行的所有容器 |
docker ps -a | 查看各种状态下的本机容器 |
docker stop [CONTAINER ID(前三位即可)] | 停止当前CONTAINER ID对应的镜像 |
docker rm [CONTAINER ID(前三位即可)] | 删除对应容器(没有删镜像) |
- 获取镜像
docker pull ubuntu:18.04
构建镜像
2.1 通过Dockerfile文件构建镜像。在运行docker容器的宿主机ubuntu内创建两个文件,Dockerfile和app.py。# Dockerfile # Base images 基础镜像 FROM ubuntu:18.04 # MAINTAINER 维护者信息 MAINTAINER yourname admin@163.com # RUN 执行以下命令 RUN apt update RUN apt install python3 python3-pip -y RUN pip3 install flask RUN mkdir -p /data/www/ # 拷贝代码实现文件至工作目录 COPY app.py /data/www/app.py # 设定工作目录 WORKDIR /data/www/ # EXPOST 映射端口 EXPOSE 8000 # 容器启动时执行命令(用Python3运行刚才的代码文件) CMD ["python3","app.py"]
2.2 通过该自定义镜像构建整个程序运行的进行文件
docker build -t demo:0.1 . -f Dockerfile
2.3 通过镜像创建容器及运行docker run demo:0.1
常规运行docker run
-p 80:8000
demo:0.1
将宿主机的80端口映射到docker中的8000端口,运行docker run
-d
-p 80:8000 demo:0.1
以后台模式启动并映射端口,几乎所有情况下都要加 -d 参数项,不然会卡住控制端,无法继续输入命令可以基于同一个镜像文件构建多个运行的容器,比如将不同的宿主机端口映射到docker中的8000端口上
docker run -d -p 80:8000 demo:0.1 docker run -d -p 81:8000 demo:0.1 docker run -d -p 82:8000 demo:0.1
基于同一个镜像文件构建了三个不同的容器,可在宿主机上访问不同端口,映射到不同容器内的8000端口上
Dockerfile指令
创建镜像阶段的指令
# Dockerfile # Base images 基础镜像 FROM ubuntu:18.04 # MAINTAINER 维护者信息 MAINTAINER <yourname> <admin@163.com> # ENV 环境配置相关 ENV <key> <value> 比如:ENV env_name=/data/www/ # RUN 执行以下命令 RUN apt update RUN apt install python3 python3-pip -y RUN pip3 install flask RUN mkdir -p $env_name # 拷贝代码实现文件至工作目录 COPY <src> <destination> # (这里指的是将本地文件app.py添加到镜像中,有两个命令,一个是COPY,另一个是ADD,两个命令都是做相同工作,只不过假如要将本地压缩包添加到镜像中,使用ADD会自动将该压缩文件解压后添加到镜像内) # 设定工作目录(所有后续命令的执行依据该目录进行) WORKDIR /data/www/ # EXPOST 映射端口(不重要,可以不添加,后续最通用的是通过docker命令使用-p参数进行端口映射) EXPOSE 8000
容器运行阶段的指令
# 容器启动时执行命令(用Python3运行刚才的代码文件) CMD ["python3","app.py"]
在使用Dockerfile构建镜像的时候,可以使用 --no-cache 参数,避免使用缓存文件构建,代码不是最新的情况。
docker build -t demo:0.1 . -f Dockerfile --no-cache
进入正在运行的容器内部:
docker exec -ti <容器id> bash