2024年了你还不会Docker吗?Docker - 快速入门

396 阅读5分钟

Docker 是一个用Go语言实现的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后运行到任何安装了 docker 的服务器上,达到一次构建,多次复用。

一、安装

1. 软件安装

Windows 和 MacOS 分别前往Docker Desktop for WindowsDocker Desktop for Mac下载安装。

Linux 系统使用官方的一键安装命令

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

若非root用户,可执行命令将当前用户加入 docker 组,而后重新登录ssh即可

sudo usermod -aG docker ${USER}

2. 配置国内源

桌面版打开设置面板-Docker Engine进行设置保存,linux下编辑/etc/docker/daemon.json文件保存并重启服务

{
    "log-driver":"json-file",
    "log-opts":{
        "max-size":"500m",
        "max-file":"3",
        "labels":"production_status,geo",
        "env":"os,customer"
    },
    "registry-mirrors":[
        "https://dhub.kubesre.xyz",
        "https://docker.chenby.cn",
        "https://docker.1panel.live",
        "https://docker.anyhub.us.kg",
        "https://dockerpull.com",
        "https://hub.rat.dev",
        "https://docker.m.daocloud.io"
    ],
    "dns":[
        "8.8.8.8",
        "8.8.4.4",
        "1.1.1.1",
        "223.5.5.5"
    ]
}

3. 配置代理

由于不可抗力,有时国内源无法使用,此时就需要为docker配置代理。

在执行 docker pull 时守护进程dockerd来执行,因此代理需要配在dockerd的环境中。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/proxy.conf

并填入以下内容,其中 192.168.1.1:7890 请替换为你自己的代理。

[Service]
Environment="HTTP_PROXY=http://192.168.1.1:7890/"
Environment="HTTPS_PROXY=http://192.168.1.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

而后重启即可

sudo systemctl daemon-reload
sudo systemctl restart docker

二、镜像

镜像对于docker来说有点类似于windows的exe文件或mac的app应用程序,将程序执行环境都打包成了镜像,当需要运行时,只需要将镜像放于任意需要运行的服务器上运行即可

1. 查看镜像

$ docker images
REPOSITORY             TAG                 IMAGE ID       CREATED         SIZE
nginx                  latest              6b3e1257976b   4 weeks ago     135MB
postgres               15-alpine           bf01f8da1bd2   4 weeks ago     209MB
alpine/git             latest              8bfbb50cd816   2 months ago    43.4MB
drone/drone            2                   e6683445823e   2 months ago    57.8MB
golang                 1.18                a38580f4a026   3 months ago    819MB
alpine                 3                   a6215f271958   4 months ago    5.29MB
rabbitmq               3.9.14-management   455611f61a5a   8 months ago    221MB
seepine/alpine         jdk8-full           516e63be9a59   12 months ago   112MB

2. 删除镜像

删除可根据名称:版本号或镜像id删除

docker rmi nginx:latest
docker rmi 6b3e1257976b

3. 查找镜像

查询有哪些可用镜像可执行查询命令,该命令会查询docker公共仓库

docker search nginx

或前往dockerHub直接搜索

4. 镜像仓库

除了docker的公共仓库外,我们还可以搭建私有仓库,或使用阿里云等其他服务提供的镜像仓库,非公共仓库与公共仓库从镜像名很容易就能看出区别,例如

镜像名仓库地址所属用户镜像标签/版本号
nginxdocker.io官方nginxlatest
nacos/nacos-server:v2.1.2docker.ionacosnacos-serverv2.1.2
seepine/alpine:openjdk8docker.ioseepinealpineopenjdk8
registry.cn-hangzhou.aliyuncs.com/seepine/mysql:8.0registry.cn-hangzhou.aliyuncs.comseepinemysql8.0

5. 拉取镜像

拉取镜像不指定版本时,默认拉取nginx:latest,也可手动指定镜像版本号

docker pull nginx
docker pull nginx:1.18.0
docker pull seepine/alpine:openjdk8

6. 构建镜像

当我们需要的镜像别人未提供,或我们需要定制镜像时,就需要编写 Dockerfile 手动构建镜像。 以SpringBoot为例构建为镜像,在项目根目录中准备 Dockerfile 文件并编写如下内容

  • 表示基于 seepine/alpine:openjdk8 镜像
  • 在此基础上创建工作目录 workspace
  • 并将本地打包后的 jar 包拷贝到镜像中为 /workspace/application.jar
  • 最终执行命令 java -jar application.jar 启动应用
FROM docker.io/seepine/alpine:openjdk8
WORKDIR workspace
COPY build/libs/*.jar /workspace/application.jar
ENTRYPOINT java -jar application.jar

此时在终端中执行jar构建出需要的jar包后

./gradlew bootJar

再执行构建镜像命令即可构建出镜像 seepine/springboot-test:v1.0

docker build -t seepine/springboot-test:v1.0 .

关于 Dockerfile 更多规则可查看官方文档DockerfileDoc

7. 推送镜像

镜像构建后只存在于你本地,需要将镜像推送到镜像仓库中,其他服务器上才能拉取得到你构建的镜像 ,推送到镜像仓库根据你构建时镜像名称,并且推送前需要先执行docker logindocker login registry.cn-hangzhou.aliyuncs.com进行登录,否则会无推送权限

docker push seepine/springboot-test:v1.0

三、容器

镜像运行之后就会变为容器,因此可知,同一个镜像是可以运行多次,变为多个容器,并且每个容器直接默认都是相互隔离的,有独立的环境、独立的ip、独立的端口等

1. 查看容器

$ docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED        STATUS                PORTS                           NAMES
d982f6a2b634   nginx                         "/docker-entrypoint.…"   23 hours ago   Up 23 hours           80/tcp                          nginx
67e0d3f57766   postgres:15                   "docker-entrypoint.s…"   2 days ago     Up 2 days             5432/tcp                        postgresSQL
5a8d39813a2f   mysql/mysql-server:8.0.27     "/entrypoint.sh --de…"   2 days ago     Up 2 days (healthy)   3306/tcp, 33060-33061/tcp       mysql_mysql-slave
134541494b44   mysql/mysql-server:8.0.27     "/entrypoint.sh --de…"   2 days ago     Up 2 days (healthy)   3306/tcp, 33060-33061/tcp       mysql_mysql-master
c01701b64b4b   portainer/portainer           "/portainer -H unix:…"   2 days ago     Up 2 days             9000/tcp                        ptr

2. 运行容器

执行以下命令即可运行一个容器(当镜像不存在时会自动拉取镜像),并可看到运行日志,但此时我们无法访问,因为容器是独立的

docker run nginx

通过 -p 参数将容器的端口映射到本机端口,此时通过本机ip:port即可访问到容器

docker run -p 8080:8080 nginx

3. 进入容器

有时我们不仅仅需要运行容器,还需要进入容器内修改某些文件,可使用命令进入到容器内部

docker exec -it c01701b64b4b sh

4. 挂载目录

我们运行的容器都是一次性的,即当我们进入容器内修改了文件后,当容器重启后,一切文件将会复原到容器镜像最初的样子,因此我们可以使用 -v 将容器内某些目录挂载出来,实现持久化。

例如以下命令,表示将容器的 /usr/share/nginx/html 目录,挂载到本机的 /root/data 目录,此时不需要进入到容器内,直接修改本机的 /root/data 目录中的文件即可生效,并且容器重启后文件依然存在。

docker run -p 8080:8080 -v /root/data:/usr/share/nginx/html nginx

当然若我们需要持久话,但又不想手动去选择挂载到本机的哪个目录,可以借助 docker volume ,即将本机目录替换为任意名词,docker 会自动帮我们创建 volume 进行保存,更多信息可查看官方文档 DockerVolumesDoc

docker run -p 8080:8080 -v nginx-data:/usr/share/nginx/html nginx

5. 停止容器

容器停止后需要使用 docker ps -a 才能查询到

docker stop c01701b64b4b

6. 删除容器

docker rm c01701b64b4b

四、DockerCompose

当运行容器增多时,一个个容器运行明显麻烦且效率低,此时可借助docker compose进行容器编排

本节内容繁多只顺便一提,需要深入了解和查看官方文档

1. 准备docker-compse.yml文件

表示会启动三个nginx服务,分别映射到端口808080818082,并挂载卷 nginx-data,更多编写规则可查询官方文档ComposeFileDoc

services:
  nginx:
    image: nginx
    ports:
      - "8080:8080"
    volumes:
      - nginx-data:/usr/share/nginx/html

  nginx1:
    image: nginx
    ports:
      - "8081:8080"
    volumes:
      - nginx-data:/usr/share/nginx/html

  nginx2:
    image: nginx
    ports:
      - "8082:8080"
    volumes:
      - nginx-data:/usr/share/nginx/html

volumes:
  nginx-data:

2. 启动

docker-compose up

3. 停止

docker-compose down

五、DockerSwarm

Docker compose解决了容器编排问题,而当服务器众多,我们仍然需要到每台服务器上去运行,还需要规划每台服务器内存多大,需要部署哪些应用。该场景下,可通过DockerSwarm将所有服务器的docker连结在一起,我们只需要在管理服务器上进行容器编排,docker会自动平衡服务器资源,将容器自动分配到每台服务器上去运行

本节内容繁多只顺便一提,需要深入了解和查看官方文档

1. 创建swarm集群

在管理服务器(也称管理节点)执行初始化

$ docker swarm init

Swarm initialized: current node (z2n633mty5py7u9wyl423qnq0) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    # 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
    docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.10.100:2377  
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2. 加入集群

在子服务器(也称工作节点)执行管理节点初始化时生成的加入指令

docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.1.100:2377

此时在管理节点执行以下指令即可查看到工作节点已加入

docker node ls

3. 容器操作

  • 使用 docker service create 代替 docker run
  • 使用 docker service ls 代替 docker ps
  • 使用 docker stack 代替 docker-compose

更多操作请查看官方文档DockerSwarmDoc

六、Portainer

Portainer是一款docker可视化管理后台,日常维护中建议使用Portainer而不用每次都登录服务器ssh去执行命令

1. 安装

执行命令,将docker权限提供给portainer容器,挂载数据卷并暴露到9000端口

数据会被持久化到 /root/volumes/portainer_data 目录,若想保存到其他地方,可自行修改

docker run -d --name ptr --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /root/volumes/portainer_data:/data portainer/portainer-ce:2.1.1

2. 管理

访问 http://127.0.0.1:9000,初次需要创建管理员账号,登录后即可进入管理后台,可对 StacksServicesContainersImagesNetworksVolumes等直接可视化操作。

需要注意的是,若在管理面板中,使用了私有镜像仓库,需要在左侧倒数第二个菜单 Registries 添加私有镜像仓库地址及授权信息。

博客内容遵循:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本文永久链接是:seepine.com/docker/star…