很多人第一次接触Docker时,会遇到一个很实际的问题:我想同时跑两个不同的镜像,比如一个数据库和一个后端服务,但不知道该怎么操作。其实核心思路很简单:Docker本身支持同时运行任意数量的容器,关键是你得理解“容器”和“镜像”的区别。镜像好比是一个安装包,而容器是运行起来的一个实例。你完全可以用docker run命令分别启动两个不同的镜像,它们互不干扰。
能不能一个命令启动两个镜像
答案是:不能直接用一个docker run命令启动两个不同的镜像。docker run的设计就是一次启动一个容器,镜像参数只能指定一个。如果你想同时启动Nginx和MySQL,必须执行两次docker run,或者写到docker-compose.yml里统一管理。很多人刚接触时会误以为可以像写脚本一样把两个镜像名塞进一个命令里,这是行不通的。正确的做法是先启动一个容器,再启动另一个,或者用docker-compose来编排。
两个容器之间怎么互相访问

这个问题很关键。你启动了两个容器后,它们默认是隔离的,不能通过localhost互相访问。比如你跑了一个MySQL容器监听3306端口,另一个是Spring Boot应用需要连这个数据库,如果你在应用里写localhost:3306,它会连自己的容器,而不是MySQL容器。解决方案有两种:最简单的是用--link参数(虽然已经标记为弃用,但还能用),或者更推荐的做法是把两个容器放到同一个自定义网络里。先创建一个网络:docker network create mynet,然后启动两个容器时都加上--network mynet,这样它们就能通过容器名来通信了。比如MySQL容器名叫mydb,应用里写mydb:3306就行。
端口冲突了怎么解决

两个容器都要用同一个宿主机端口时就会出问题。比如你跑了两个Nginx容器,都想用80端口,宿主机不可能同时把80端口分配给两个容器。解决办法是给其中一个容器映射不同的宿主机端口:docker run -p 8080:80 nginx,这样宿主机8080对应容器80,另一个容器用-p 8081:80。注意,容器内部的端口可以随便重复,因为每个容器有自己的网络命名空间,但宿主机端口是全局唯一的。如果你的场景需要两个容器暴露同一个宿主机端口,那就要考虑用反向代理或者负载均衡了。
资源竞争怎么控制
同时跑两个容器,尤其是一个吃内存、一个吃CPUdocker run 两个image,很容易把宿主机搞垮。Docker提供了资源限制参数,启动时就可以指定。比如跑一个Java应用容器,限制内存:-m 512m;跑一个数据处理任务,限制CPU:--cpus=1.5。这样两个容器各自有上限,不会互相抢资源导致其中一个死掉。实际线上部署时,最好提前评估每个容器的资源需求国内linux主机,然后给它们留点余量。如果你是在本地开发环境跑两个镜像,资源通常够用,但也要注意避免同时跑太多容器把电脑卡死。
启动顺序怎么控制

有些场景下,一个容器依赖另一个容器先启动。比如你的应用容器需要等数据库容器完全就绪才能正常启动。docker run本身不提供依赖控制,你只能手动先启动数据库docker run 两个image,等几秒再启动应用。更靠谱的做法是用docker-compose的depends_on配置,它能保证容器启动的先后顺序,但注意它只保证启动顺序,不保证数据库服务已经完全可连。你还需要在应用代码里加重试机制,或者用healthcheck来检查服务是否真正就绪。
实际用起来,同时跑两个镜像并不复杂,核心就是分两次启动、处理好网络和端口、控制好资源。如果你经常需要同时启动多个容器,强烈建议学一下docker-compose,写一个yaml文件就能一键启动所有服务linux命令行,省心很多。
