介绍
Docker是一个使用容器技术来构建、共享和运行应用程序的平台。Docker将应用与应用的依赖打包在一起,只要环境有Docker,应用就可以运行。
安装
本机系统为macOS10.14.6,故以下为Mac版本的演示。
安装桌面版DockerDocker Desktop For Mac
,官网下载地址,如地址失效请参考Docker For Mac安装指南。
下载完安装包后,双击安装。
安装完成后,在终端执行版本命令验证。
docker -version
Docker version 19.03.5, build 633a0ea
核心
镜像 Image
镜像是将应用和应用的配置和依赖打包在一起的文件。
- 获取镜像,从远程下载镜像到本地。NAME是镜像名称,TAG是版本信息,如果不指定TAG,则会选择latest,也就是最新版本。
# 默认从Docker Hub下载
docker pull IMAGE_NAME:TAG
# 指定其他镜像服务器
docker pull myregistry.local:5000/IMAGE_NAME:TAG
- 搜索远程镜像,也可以在Docker Hub上搜索。
docker search KEYWORD
# 官方镜像
docker search KEYWORD -f=is-official=true
docker search KEYWORD --limit=5
-f=KEY=VALUE
过滤
--limit=NUMBER
限制搜索结果
- 本地镜像列表
docker images
- 镜像详情
docker inspect IMAGE_NAME:TAG/IMAGE_ID
docker inspect -f {{.Os}} IMAGE_NAME:TAG/IMAGE_ID
docker inspect -f {{.Config.Env}} IMAGE_NAME:TAG/IMAGE_ID
-f {{.PROPERTY}}
过滤
- 删除镜像,如果有镜像或容器依赖, 则不允许删除。
docker rmi IMAGE_NAME:TAG/IMAGE_ID
-f
强制删除
-
创建镜像
- 基于已有容器
docker commit CONTAINER_NAME/CONTAINER_ID IMAGE_NAME:TAG/IMAGE_ID
-m "MESSAGE"
提交信息
-a "AUTHOR"
作者
-c "COMMAND"
执行Dockerfile指令
-p
暂停容器运行- 基于Dockerfile创建,后面章节会进行详细介绍。
docker build DOCKERFILE_DIR
-t IMAGE_NAME:TAG
指定镜像名称和版本
-f DOCKERFILE_NAME
指定Dockerfile名称,默认为Dockerfile 镜像构建历史
docker history IMAGE_NAME:TAG/IMAGE_ID
--no-trunc
输出完整信息
仓库 Repository
集中存放镜像的地方。
仓库分为:
- 官方仓库,官方提供的仓库 Docker Hub。
- 三方仓库,一些云服务商提供的仓库,如阿里云、腾讯云。
- 私有仓库,本地搭建的仓库。
容器 Container
容器,是一个镜像运行的实例。
- 创建容器
docker create IMAGE_NAME:TAG
-i
打开标准输入
-t
分配伪终端
-p HOST_PORT:CONTAINER_PORT
映射端口
--name=CONTAINER_NAME
容器别名
- 启动容器
docker start CONTAINER_NAME/CONTAINER_ID
- 新建并启动容器,先创建再启动容器。
docker run IMAGE_NAME:TAG
-d
后台运行
- 停止容器
docker stop CONTAINER_NAME/CONTAINER_ID
- 重启容器,先停止再启动容器。
docker restart CONTAINER_NAME/CONTAINER_ID
- 删除容器,删除终止或退出状态的容器。
docker rm CONTAINER_NAME/CONTAINER_ID
-f
强行终止并删除一个正在运行的容器
- 进入容器
docker exec CONTAINER_NAME/CONTAINER_ID COMMAND
docker exec CONTAINER_NAME/CONTAINER_ID /bin/bash
-d
后台执行命令
-i
打开标准输入
-t
分配伪终端
- 运行容器列表
docker ps
docker ps -a
-a
全部容器
- 容器日志
docker logs CONTAINER_NAME/CONTAINER_ID
-f
持续输出,Ctrl+c退出
- 容器详情
docker container inspect CONTAINER_NAME/CONTAINER_ID
- 容器进程信息
docker top CONTAINER_NAME/CONTAINER_ID
- 查看运行容器的统计信息,CPU、内存、存储、网络等使用情况。不指定容器,则查看所有容器。
docker stats CONTAINER_NAME/CONTAINER_ID
-a
全部容器
-no-stream
不持续输出
- 查看容器端口映射
docker port CONTAINER_NAME/CONTAINER_ID
实例
配置国内镜像服务器
国内从Docker官方服务器下载镜像很慢,可以更换为国内镜像服务器。
- Preferences->Daemon->Basic->Registry mirrors,添加地址
https://registry.docker-cn.com
- 配置完成后重启Docker
运行Hello World
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
docker run执行逻辑
Dockerfile
Dockerfile是一个配置文件,可以使用它快速创建自定义镜像。
结构
- 基础镜像
FROM IMAGE_NAME:TAG
- 维护信息
LABEL version=“x.x.x"
LABEL maintainer=“[email protected]” date="xxxx-xx-xx"
- 镜像操作指令
RUN COMMAND
- 容器启动时指令
CMD ["EXECUTABLE", "PARAM1", "PARAM2"]
指令
- 配置指令
ARG KEY=VALUE
过程变量,编译成功后变量不再存在。Dockerfile中使用${KEY}
调用。在执行docker build
时,可使用--build-arg=KEY=VALUE
赋值。
FROM IMAGE_NAME:TAG
创建镜像的基础镜像
LABEL KEY=VALUE
标签辅助信息
EXPOSE PORT1 PORT2
声明监听的端口,提示作用。
ENV KEY=VALUE
环境变量,
VOLUME /DIR
创建数据卷挂载点,一般用于数据持久化。
WORKDIR /DIR
工作目录,为RUN、CMD指令配置工作目录。
SHELL ["EXECUTABLE", "PARAM"]
指定shell类型,默认值["/bin/sh", "-c"] - 操作指令
RUN COMMAND
运行指定命令
CMD ["EXECUTABLE", "PARAM1", "PARAM2"]
启动容器时执行的命令,如果有多条,只执行最后一条。
ADD SOURCE DESTINATION
添加文件到镜像内
COPY SOURCE DESTINATION
拷贝文件到镜像内 - 其他
# xxx
注释
# escape=\或'
指定转义字符,默认值\
,用于转义和换行。需放在Dockerfile首行。
Dockerfile实战
使用Dockerfile构建镜像,实现Java环境下输出Hello World。
新建Java文件
vim Hello.java
粘贴如下内容:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
保存退出,按Esc键后输入如下指令:
:wq
新建Dockerfile文件
vim Dockerfile
粘贴如下内容
# 基础镜像
FROM openjdk:8-jdk-alpine
# 工作目录
WORKDIR /app
# 将Java文件拷贝到工作目录
COPY Hello.java /app
# 执行Java编译命令
RUN javac Hello.java
# 容器启动后,执行Java启动命令
CMD ["java", "Hello"]
保存退出,按Esc键后输入如下指令:
:wq
构建镜像
docker build -t hello-world-jdk8 .
Sending build context to Docker daemon 4.096kB
Step 1/5 : FROM openjdk:8-jdk-alpine
8-jdk-alpine: Pulling from library/openjdk
e7c96db7181b: Pull complete
f910a506b6cb: Pull complete
c2274a1a0e27: Pull complete
Digest: sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f2283343547b3
Status: Downloaded newer image for openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/5 : WORKDIR /app
---> Running in 7659847fafe9
Removing intermediate container 7659847fafe9
---> 86d52aad69f9
Step 3/5 : COPY Hello.java /app
---> e34c55eb5bb6
Step 4/5 : RUN javac Hello.java
---> Running in d997749e1bf4
Removing intermediate container d997749e1bf4
---> 8e8adb4fe3bb
Step 5/5 : CMD ["java", "Hello"]
---> Running in 305cb9a7f51d
Removing intermediate container 305cb9a7f51d
---> 029841718545
Successfully built 029841718545
Successfully tagged hello-world-jdk8:latest
查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world-jdk8 latest 029841718545 53 seconds ago 105MB
运行容器
docker run hello-world-jdk8
Hello World!
查看容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46dd5a15aa8d hello-world-jdk8 "java Hello" 6 seconds ago Exited (0) 5 seconds ago relaxed_saha
参考资料
- 官网:Docker Engine介绍
- 官网:Docker For Mac安装指南
- 官网:Docker入门
- 官网:Dockerfile参考
- 官网:Docker命令