Docker基础入门

介绍

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命令

你可能感兴趣的:(Docker基础入门)