Docker-run命令详细讲解

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令(本小节属于)

Dockerfile

Docker镜像

Docker仓库

Docker原理

Docker网络&存储&日志

Docker-Compose

Docker番外篇

上小节我们从docker的原理上来讲解了下docker的运行机制,今天我们就从实际操作来体验下docker run的在运行这些操作容器。

我们在Docker被墙以后,我为什么这样做,里面提到过镜像实际上分类,一种是操作系统镜像,一种是业务镜像。里面有些例子可能不是很合适。从我们上小节的例子可能分为是否有前台进程来更适合一点。针对不同的镜像会使用不同的参数,下面就针对这些参数做详细说明。

启动基本参数

这些参数的组合代表了这个容器的运行方式及能否正常启动

#效果是一样的,启动则退出
docker run centos:7
docker run -d centos:7

#启动则进入容器,exit退出容器,则容器关闭
[root@localhost ~]# docker run -it centos:7
[root@b914ccb36e5c /]# 
#会阻塞当前终端操作,中断终端则容器退出
docker run nginx

#不会阻塞当前终端,容器会持续在后台运行
docker run -d nginx

​​​​​​​

图片

下面的这些参数不影响容器是否启动成功,但是它能决定能否按照我们的预期方式进行运行。

添加环境变量

# 创建容器,注入数据库密码环境变量
# 这里只是演示,具体请设置强密码
[root@localhost ~]# docker run -d -e MYSQL_ROOT_PASSWORD=my-secret-pw 192.168.31.43:5000/mysql:5.7
da6a4018d3c1e47b1fae3f0adb63ff78f3ef7fcde7899158e0caaf6da43a188a
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS         PORTS                               NAMES
da6a4018d3c1   192.168.31.43:5000/mysql:5.7   "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   3306/tcp, 33060/tcp                 jolly_euler


#进入容器,并使用注入的密码进行登录mysql
[root@localhost ~]# docker exec -it da6 bash
bash-4.2# mysql -uroot -pmy-secret-pw
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

添加端口映射

[root@localhost ~]# docker run -d -p80:80 192.168.31.43:5000/nginx
7a559247280c4c6211c89197b2808ca326a0646f644f0433b04a6e70fef0d2ad
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED             STATUS             PORTS                               NAMES
7a559247280c   192.168.31.43:5000/nginx      "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds       0.0.0.0:80->80/tcp, :::80->80/tcp   stoic_hodgkin
​​​​
#这里的端口都是docker进程在监听
[root@localhost ~]# netstat -lnp |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7070/docker-proxy

添加磁盘挂载​​​​​​​

# 容器外面的数据文件可以挂载到容器内部
# 容器里面创建的文件实际会创建到主机里面
[root@localhost ~]# ls
centos7.tar.gz
[root@localhost ~]# docker run -it -v /root:/root centos:7 
[root@2eb1e448090b /]# ls /root/
centos7.tar.gz
[root@2eb1e448090b /]# touch /root/aaa
[root@2eb1e448090b /]# exit
exit
[root@localhost ~]# ls
aaa  centos7.tar.gz

添加主机名

# 可以看到容器的主机名是我们设置的,并不是随机生成
[root@localhost ~]# docker run -h test001 -it centos:7
[root@test001 /]# 

添加容器名字​​​​​​​

# 容器名字在最后,没添加就是随机名字
[root@localhost ~]# docker run  -itd centos:7
90b11f48c37dd2f8483a2ff2ae6f3797767ce508a465fd9cfda57eab57af5e53
[root@localhost ~]# docker run  -itd --name centos7 centos:7
a9c28148a23c6ae2a8f77cc7258ffd7a32ff9901094b5c56b256515ac65f0c7d
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
a9c28148a23c   centos:7   "/bin/bash"   11 seconds ago   Up 10 seconds             centos7
90b11f48c37d   centos:7   "/bin/bash"   43 seconds ago   Up 42 seconds             optimistic_shirley

退出则删除

# 容器退出以后,容器就被自动删除
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker run -it --rm centos:7
[root@83510e3d5cdd /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@83510e3d5cdd /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

限制cpu​​​​​​​

# 限制了只给0.5核,所以容器里面的死循环可以跑到50%
[root@localhost ~]# docker run -itd --cpus="0.5" centos:7
1a408a957c2c60519e3f15aed8b23ae6d069ea14c30710aa792d93689331c508

[root@localhost ~]# docker stats 1a4

CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O    PIDS
1a408a957c2c   youthful_bassi   49.94%    1.262MiB / 990.9MiB   0.13%     656B / 0B   336kB / 0B   2

限制内存

# 限制以后,这里的limit就不再是宿主机的内存,而是我们给的限制
[root@localhost ~]# docker run -itd -m 512M centos:7
1888ebd8c68bc2edca3410049557e31d20cb9058ead658a891c13007ba39e4b2
[root@localhost ~]# docker stats 1888

CONTAINER ID   NAME               CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
1888ebd8c68b   gallant_brattain   0.00%     668KiB / 512MiB     0.13%     586B / 0B   3.82MB / 0B   1

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

<think>好的,我现在要解决用户关于docker-compose build命令的用法和功能的询问。首先,我需要回忆自己对这个命令的了解。docker-compose build主要用于根据docker-compose.yml中的配置构建或重新构建服务对应的镜像。用户可能在使用docker-compose时,需要自定义镜像或者修改了Dockerfile后重新构建,这时候就会用到build命令。 接下来,我需要确认用户的需求。他们想要详细的教程和功能详解。这意味着我需要分步骤解释如何使用这个命令,同时说明它的各个选项和适用场景。根据提供的引用内容,用户可能已经了解了一些docker-compose的基础知识,比如up -d和scale命令,但需要更深入build的具体信息。 我需要查阅相关的资料,确保信息的准确性。例如,docker-compose build命令的基本用法是构建服务,但有哪些参数可以使用?比如--no-cache选项可以避免使用缓存,这在需要全新构建时很有用。还有--pull参数可以拉取最新的基础镜像。这些参数的功能需要详细说明。 同时,用户可能想知道什么时候应该使用build命令。比如,当修改了Dockerfile或者项目文件后,需要重新构建镜像才能应用这些更改。这时候运行docker-compose build,再运行up命令就会使用新的镜像启动容器。 还要注意,docker-compose build默认只会构建那些在配置文件中指定了build上下文的服务。如果服务使用的是预构建的镜像(比如image: nginx),则不会触发构建过程。这一点需要明确说明,避免用户混淆。 另外,结合用户提供的引用内容,引用[2]提到Dockerfile的作用,而引用[3]和[4]涉及docker-compose的部署和命令使用,这可以帮助用户理解build在整个流程中的位置。比如,构建镜像是部署的前置步骤,之后才能通过up命令启动服务。 可能用户还会遇到常见问题,比如构建时缓存导致的问题,这时候需要指导他们使用--no-cache选项。或者如何同时构建多个服务,这时候需要指定服务名称作为参数。 最后,生成相关问题的时候,要考虑用户可能进一步询问的内容,比如优化构建时间、多阶段构建,或者如何结合其他命令如up一起使用。这些相关问题可以帮助用户更全面地掌握docker-compose build的应用场景和高级用法。</think>### Docker Compose Build 命令详解 #### **功能概述** `docker-compose build` 用于根据 `docker-compose.yml` 文件中定义的配置,构建或重新构建服务的镜像。此命令适用于以下场景: 1. 修改了服务的 `Dockerfile` 或构建上下文文件后,需要重新生成镜像。 2. 需要强制重新构建镜像(跳过缓存)。 3. 在部署前手动构建镜像,而非依赖远程仓库的预构建镜像[^2][^3]。 --- #### **基础用法** 1. **构建所有服务镜像**: ```bash docker-compose build ``` 默认会构建 `docker-compose.yml` 中所有包含 `build` 字段的服务。 2. **构建指定服务镜像**: ```bash docker-compose build [服务名1] [服务名2] ``` 例如 `docker-compose build web database`,仅构建 `web` 和 `database` 服务。 --- #### **核心参数详解** | 参数 | 功能描述 | |-------------------|------------------------------------------------------------------------------------------| | `--no-cache` | 构建时忽略缓存,强制重新执行所有步骤(例如修改了 `Dockerfile` 的中间步骤时使用)。 | | `--pull` | 在构建前拉取基础镜像的最新版本(确保使用最新的 `FROM` 镜像)。 | | `--build-arg` | 传递构建参数到 `Dockerfile`,格式为 `--build-arg KEY=VALUE`。 | | `--force-rm` | 构建完成后删除中间容器(优化存储空间)。 | --- #### **典型使用场景** 1. **修改代码后重新构建镜像** 假设 `web` 服务的镜像依赖项目代码: ```bash # 修改代码后执行 docker-compose build web docker-compose up -d # 重新启动服务以应用新镜像[^4] ``` 2. **多阶段构建优化** 若 `Dockerfile` 使用多阶段构建(如分离编译环境和运行环境),可通过 `build` 确保生成最小化镜像: ```dockerfile # Dockerfile 示例 FROM golang:1.19 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine:latest COPY --from=builder /app/myapp /usr/local/bin/ CMD ["myapp"] ``` 执行 `docker-compose build` 后,会按阶段生成最终镜像。 --- #### **注意事项** 1. **与 `docker-compose up` 的关系** - 若直接运行 `docker-compose up`,默认会自动构建缺失的镜像。 - 使用 `docker-compose up --build` 可合并构建和启动步骤(等价于 `build` + `up`)。 2. **镜像命名规则** 若 `docker-compose.yml` 中未指定 `image` 字段,生成的镜像名称格式为 `[项目名]_[服务名]:latest`。 例如项目名为 `myapp`,服务名为 `web`,则镜像为 `myapp_web:latest`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值