Docker和Dockerfile常用命令总结及微服务打包Docker镜像

一、Docker 常用命令总结

在这里插入图片描述

1. 帮助命令

# 查看docker的所有命令详情
docker --help

# 查看docker对应命令的使用详情
docker 命令 --help

# 如:查看docker images的使用方法
docker images --help

[root@fussy ~]# docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs

2. 镜像命令

# 从DockerHub上查询nginx镜像
docker search nginx
[root@fussy ~]# docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        16041     [OK]       
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2104                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   820                  [OK]

# 拉取nginx镜像
docker pull nginx

# 拉取nginx指定版本镜像
docker pull nginx:1.9

# 查看所有镜像
docker images -a
[root@fussy nginx]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       latest    5d0da3dc9764   3 months ago     231MB

# 修改镜像的版本信息(原镜像不变,生成一个修改版本信息后的副本镜像)
docker tag 源镜像:TAG 目标镜像:TAG
docker tag centos:latest my/centos:1.0
[root@fussy nginx]# docker tag centos:latest my/centos:1.0
[root@fussy nginx]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       latest    5d0da3dc9764   3 months ago     231MB
my/centos    1.0       5d0da3dc9764   3 months ago     231MB

# 查看所有镜像的ID
docker images -aq
[root@fussy nginx]# docker images -aq
92b28ed32bef
5d0da3dc9764

# 删除指定的镜像
docker rmi -f 镜像

# 删除所有的镜像
docker rmi -f $(docker images -aq)

# 查询指定镜像详情
docker inspect 镜像
docker inspect centos

# 构建镜像
docker build -f 文件所在路径 -t 生成的镜像名称:TAG .
docker build -f Dockerfile -t myimages:1.0 .

3. 容器命令

# 启动容器
docker run 镜像
docker run centos

# 启动容器并进入命令行
docker run -it 镜像

# 启动容器并后台运行
docker run -d 镜像

# 启动容器并指定自定义的网络
docker run --net mynet 镜像

# 启动容器并指定容器名称,同时进入容器的命令行
docker run -it --name centos01 --net mynet centos /bin/bash

# 启动容器并指定端口映射(可指定多个)
docker run -p 主机端口:容器端口 镜像
docker run -p 3500:80 -p 3600:8080 nginx

# 启动容器并随机映射端口
docker run -P 镜像

# 启动容器并指定具名数据卷(可指定多个)
docker run -v 主机路径:容器路径 镜像
docker run -v /usr/local/nginx/conf:/etc/nginx -v /usr/local/mysql/data:/etc/mysql/data 镜像

# 查看容器详情
docker inspect 容器名称或容器ID

# 进入指定的容器
# 第一种方式(重新进入命令行)
docker exec -it 容器名称或容器ID /bin/bash
docker exec -it 44a231940d74 /bin/bash
[root@fussy nginx]# docker exec -it 44a231940d74 /bin/bash
[root@44a231940d74 /]# 

# 第二种方式(进入上一次的命令行)
docker attach 容器名称或容器ID
docker attach 44a231940d74
[root@fussy nginx]# docker attach 44a231940d74
[root@44a231940d74 /]# 

# 退出并停止容器
exit

# 退出但不停止容器
ctrl + q + p

# 查看所有运行的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看所有容器的ID
docker ps -aq

# 删除所有容器
docker rm -f $(docker ps -aq)

# 停止、启动容器
docker stop/start 容器名称或容器ID

# 将容器提交到仓库中,变成一个镜像
docker commit -m  提交信息  -a  作者  容器名称或容器ID  镜像名称:TAG
docker commit -m '第一次提交' -a 'liulusheng' ccff597ebb23 myimages:1.0

4. 网络命令

# 查看docker的所有网络
docker network ls

# 查看对应网络的详细信息
docker network inspect 网络名称或网络ID
docker network inspect mynet
[root@fussy ~]# docker network inspect mynet
[
    {
    
    
        "Name": "mynet",
        "Id": "447f6cf844a45e15bc746a7c97736ed61937b19b29f40b3b9d8bb364de26d949",
        "Created": "2021-12-30T13:48:14.4242933+08:00",
        "Scope": "local",
        "Driver": "bridge",
]


# 创建自定义网络
docker network create -d 网络模式(默认是bridge桥接模式) --subnet 子网掩码 --gateway 网关 网络名称
docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

# 删除指定的网络
docker network rm 网络名称
docker network rm mynet

5. 其他命令

# 查看容器ip详情
ip addr
[root@44a231940d74 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.2/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
# 登陆DockerHub仓库
docker login
[root@fussy nginx]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 18879676724
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 退出DockerHub仓库
docker logout

# 提交镜像到远程仓库
# 目标镜像名称一定要是`DockerHub用户名/镜像名称`的形式才能发布到DockerHub,以保证镜像名称的唯一性。
# 如果目标镜像名称不符合要求,则可以使用如下命令修改。`docker tag 源镜像:TAG 目标镜像:TAG`
docker push 目标镜像:TAG
docker push 18879676724/centos:1.0

[root@fussy nginx]# docker push 18879676724/centos:1.0
The push refers to repository [docker.io/18879676724/centos]
74ddd0ec08fa: Pushing [===>                                               ]  17.45MB/231.3MB
74ddd0ec08fa: Pushed 
1.0: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529

二、Dockerfile 常用命令总结

Dockerfile 中的脚本命令全都是大写,编写好后的 Dockerfile 文件后,通过 docker build -t xxx . 命令可构建出一个可执行的镜像。

命令:docker build -f 文件所在路径 -t 镜像名称:TAG .

若编写的Dockerfile脚本文件名称为Dockerfile,则可以省略 -f 参数

1. FROM

定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像

FROM nginx

2. RUN

RUN:用于 docker build 构建镜像时执行的shell命令

FROM nginx
# 以下执行会创建 3 层镜像,需要注意的是:每RUN一次,都会在 docker 上新建一层镜像.
# 过多无意义的层,会造成镜像膨胀过大。
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
FROM nginx
# 可以通过&&符号连接命令,这样只会生成一层镜像
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

3. MAINTAINER

声明镜像的作者和联系方式

FROM nginx
# 作者和联系方式
MAINTAINER Author [email protected]

4. COPY

复制指令,从上下文目录中复制文件或者目录到容器内的指定路径

COPY <源路径1>... <目标路径>
# <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则
# <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
COPY hom*.jar /mydir/app.jar

5. ADD

ADD 指令和 COPY 的使用格类似,功能也类似,不同之处在于,如果源文件是压缩文件,则会将源文件解压,并且解压到目录路径中。

ADD jdk1.8.tar.gz /usr/local/jdk

6. ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 示例
ENV NODE_VERSION 7.2.0
RUN echo $NODE_VERSION

7. EXPOSE

仅仅只是声明端口。帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

EXPOSE <端口1> [<端口2>...]

8. WORKDIR

工作路径,即容器启动后默认进入的路径

WORKDIR /usr/local

9. LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 示例,添加作者
LABEL authors="runoob"

10. VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,避免重要的数据,因容器重启而丢失。

VOLUME ["<路径1>", "<路径2>"...]
# 将容器内的 /etc/nginx 和 /etc/mysql/data 目录中的内容挂载到主机上
# 在启动容器 docker run 的时候,我们也可以通过 -v 参数修改挂载点
VOLUME ["/etc/nginx", "/etc/mysql/data"]

11. CMD

类似于 RUN 指令,用于执行 shell 命令程序,但二者运行的时间点不同:CMD 是在 docker run 容器启动时运行,而RUN是在 docker build 构建镜像时运行。

CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖

如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

12. ENTRYPOINT

ENTRYPOINT 指令基本等同于 CMD 指令,也是在 docker run 容器启动时执行,但其不会被 docker run 的命令行参数所指定的指令所覆盖,而是把这些命令行参数传递给 ENTRYPOINT 指令指定的程序执行。

如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
  • 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

# 1. 不传参运行
docker run nginx:test

# 容器内会默认运行以下命令,启动主进程
nginx -c /etc/nginx/nginx.conf


# 2. 传参运行
docker run nginx:test -c /etc/nginx/new.conf

# 容器内会默认运行以下命令,启动主进程
nginx -c /etc/nginx/new.conf

三、SpringBoot微服务打包Docker镜像

1. 编写Dockerfile文件

新建 Dockerfile 文件, 写入脚本命令。

# 基于jdk1.8
FROM java:8

# 声明作者
MAINTAINER author [email protected]

# 将jar包拷贝至运行容器的根目录下
COPY *.jar /app.jar

# 容器运行时执行的命令
ENTRYPOINT java -jar /app.jar > app.log

# 容器运行时,传递给ENTRYPOINT的参数
CMD ["--server.port=8080"]

# 最终会执行 java -jar /app.jar > app.log --server.port=8080

2. 构建镜像

Jar 包与 Dockerfile 文件放置在同一个文件夹下

# 根据Dockerfile文件构建镜像
docker build -t app:1.0 .

3. 启动容器

# 通过app镜像启动容器,并映射端口8181->8080,随后可以通过`主机IP:8181`访问该项目
docker run -d -p 8181:8080 app:1.0

猜你喜欢

转载自blog.csdn.net/L28298129/article/details/122236704