参考教程:Docker——从入门到实践
官方文档;命令行详解
镜像 image
- 拉取/下载镜像:
docker pull 镜像名
:docker pull ubuntu:18.04 - 列出所有下载镜像:
docker image ls
- 删除镜像:
docker image rm 镜像短ID/镜像名
- 当有容器在使用该镜像时,镜像是无法删除的
- 根据Dockerfile构建镜像:
docker build -t nginx:v3 .
- 指定最终镜像名称为 -t nginx:v3
.
表示镜像构建上下文,Docker引擎会收到该路径下的所有文件,所以不需要的文件最好写在.dockerignore
里,不然会一起打包发给Docker引擎-f ../Dockerfile.php
:指定Dockerfile的位置和名字,不写的话默认是将上下文目录下的名为Dockerfile
的文件作为 Dockerfile。
容器 container 操作命令
镜像运行之后就成了容器
- 显示所有状态的容器:
docker ps -a
created
|restarting
|running
|removing
|paused
|exited
|dead
- 显示正在运行的容器:
docker ps
- 基于一个镜像新建一个容器:
docker run -it 镜像名
docker run -it python:3.8.5 bash- 放在镜像名后的是命令,-之后的是参数
-it bash
表示希望有个交互式Shell:-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开。--rm
:这个参数是说容器退出后随之将其删除。-h
:设置hostname-v
:设置数据卷。通过-v参数可进行目录挂载。冒号前为宿主机目录,冒号后为镜像容器内挂载的路径,两者必须为绝对路径。如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录。--name
:设置容器名
- 启动已终止容器:
docker container start 容器名
- 守护态运行
-d
:此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面,即容器启动后会进入后台docker container logs [container ID or NAMES]
:获取容器输出信息
- 终止容器:
docker container stop
- 或者在终端运行时
exit
或者Ctrl+d
- 或者在终端运行时
- 进入容器操作:
docker attach 容器id
:eixt时,容器会停止docker exec -it 容器id bash
:exit时,容器不会停止
- 删除容器:
docker container rm 容器id
只能删除终止状态的容器-f
:删除运行中的容器
docker compose
docker-compose.yml
所在文件目录运行
docker-compose up
:启动所有需要的容器,当之前已经启动过,再使用启动的也是启动之前已经用dockerfile创建好的image镜像,通过CTRL+C
停止所有容器,停止命令。- 若运行该命令前,所有容器都已在运行中,该命令可以进入打印所有容器状态的模式中,且不会暂停再重启容器(猜想)
docker-compose up
启动时,如果docker-compose.yml
文件有变动,它会针对这个文件的变动形成不同的构建(猜想)。但如果对某一镜像的dockerfile进行改变,该命令使用的还是老的dockerfile构建的镜像。如果重新构建镜像,使用docker-compose build
命令- 生产环境下使用
-d
在后台运行所有容器,不然都在前台启动并打印容器信息
docker-compose run
:
在指定服务上执行一个命令,比如用up命令开启一个项目后,需要迁移数据库的,就另开一个cmd用这个命令makemigrations。那我的理解就是,这时候并不会新开一个容器,而是相当于在原来已经启动的容器里操作。docker-compose run后跟的是docker-compose.yml文件中服务的名字,并不是容器名。docker exec后跟的是容器名
docker-compose run web python manage.py syncdb
:django示例里面的示范docker-compose run --rm app python manage.py migrate
docker exec -it docker_nginx_uwsgi_web_1 /bin/bash start.sh
:在指定容器里执行内容。比如这句就是为了django项目使用migrate命令用的
docker-compose down
:停止所有容器并移除网络。这个操作和ctrl+c
不太一样,这个操作会remove所有容器,但ctrl+c
应该只是暂停容器,下次再up,开始的还是之前使用过的容器,里面的数据也不会消失。
docker-compose logs [SERVICE...]
:查看容器输出
文件命令
web:
build: .
ports: #绑定容器的端口到主机的端口,(猜测:相当于暴露吗)
- "5000:5000"
# (host:container)
depends_on: #解决容器依赖、启动先后的问题
- db
- redis
expose: #暴露本容器的端口给项目中连接本容器的容器
- "5000"