docker虽然有windows、macos版本,但是只建议在linux上用docker。
因为docker只能在linux中实现容器(其他系统实际上是安装linux虚拟机上使用docker)。
1. docker安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#从脚本安装Docker CE。(一般包括docker-ce,docker-cli,containerd.io)
#也可以设置软件仓库用apt、yum安装。详见https://docs.docker.com/engine/install/
docker ce脚本会自动安装docker-ce, docker-ce-cli和containerd.io。
- docker-ce:社区版(community edition)的docker engine。
- docker-ce-cli:docker-ce引擎的命令行界面。
- containerd.io:containerd服务(service也称为守护进程),在docker引擎上工作,是docker包必须的。
docker官网提供的docker desktop是包含docker engine, decker cli, docker compose, kubernetes等工具的包。docker desktop个人版免费,高级版收费。
docker基础命令
docker -v
:查看docker是否安装,显示安装版本docker version
:查看docker详细版本信息docker info
:查看docker信息(包括是否正在运行)
docker常用名词
- 容器(container):docker创建的一个实例(相当于一个沙箱,虽然不是虚拟机,但是使用中类似虚拟机),容器间互不影响。
- 镜像(image):类似于虚拟机中的系统镜像,docker根据镜像创建容器。镜像配置了容器的系统版本、基本设置、安装的软件等。
- 仓库(reposity):存放镜像的仓库。
2. docker镜像操作
docker search centos
#搜索仓库中是否存在centos镜像docker pull centos
#从仓库中获取centos镜像,并下载到本地docker images
#查看当前已下载的镜像列表docker rmi centos
#删除一个或多个镜像。-f
可以强制删除
仓库换国内源的方法
- vi /etc/docker/daemon.json
- 在{}内增加一行:
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
3. 容器操作
docker run centos
:根据centos镜像创建容器实例-d
:后台运行容器,并返回一个容器id-i
:交互式运行容器- exit:交互模式下,退出并停止容器。
- Ctrl+p,Ctrl+q:交互模式下,只退出容器,不停止容器
-it centos /usr/bin/bash
:为容器重新分配一个为输入终端,通常与-t同时使用-p 8080:80
:指定端口映射(把8080端口映射到80)
docker run centos python app.py
:创建容器,并且在docker中运行一个应用。docker ps
:列出当前运行的容器docker ps -a
:列出所有容器。同docker container ls -adocker top 容器ID或容器名称
:查看容器内运行的进程。必须是正在运行的容器。docker inspect 容器ID或容器名称
查看容器详细配置信息
docker容器的自动退出
docker会在前置进程(主线程)运行完毕后自动退出。所以任务很简单的容器,比如helloworld,1秒左右就会自动结束。
所以要容器一直运行,就需要有一个常驻前置进程。
有人就用while循环(当然要sleep一下)实现常驻进程。(bash用参数-c执行循环)
docker run -d centos bash -c "while true;do echo hello docker;sleep 1;done"
用交互模式也可以保持docker不退出
docker run -itd centos bash
#docker run -id centos 也ok
前台运行一个常驻应用也是也可以的。
容器运行后执行操作
docker attach 容器ID
:以交互方式进入到指定容器。退出后容器结束。docker exec 容器ID python app.py
:在容器中运行指定的应用或命令。- -i:交互模式
- -t:指定伪终端
- -d:后台运行
- -w:指定容器内部的工作目录
docker exec -i 容器ID bash
:交互方式在容器中运行bash。-it也ok。attach不同,退出后容器不会结束。docker logs 容器ID
:查看容器内部的标准输出。docker cp 容器ID
:容器内的文件路径 宿主机路径从容器内拷贝文件到宿主机
4. 容器生命周期管理
docker start 容器id
:启动已经停止的容器docker stop 容器id
:停止运行中的容器docker restart 容器id
:重启容器docker kill 容器id
:强制停止容器docker rm 容器id
:删除已经停止的容器,-f可以强制删除正在运行的容器docker pause 容器id
:暂停容器docker unpause 容器id
:恢复暂停的容器
更多的容器docker的命令可以参考https://blog.csdn.net/weixin_39895862/article/details/110465890
5. docker服务(service)管理
docker由后台服务端和客户端组成。从docker version和docker info都可以看到,docker包含server和client。
docker的server在linux中以服务(service也称为守护进程daemon)的形式在后台运行。老版本的linux用service命令管理,新版本的linux通常使用systemctl命令管理service。
要使用docker必须先启动docker服务。但是,实际使用中并不需要先启动服务,在使用docker命令时,会自动启动docker服务,并且非常快。对于服务器,通常还是设置自动启动docker服务。
管理serivice的基本命令
# 启动服务
systemctl start docker.service
# 关闭服务
systemctl stop docker.service
# 重启服务
systemctl restart docker.service
# 杀死一个服务的所有子进程
systemctl kill docker.service
# 重新加载一个服务的配置文件
systemctl reload docker.service
# 重载所有修改过的配置文件
systemctl daemon-reload docker.service
# 显示服务的状态
systemctl status docker.service
# 显示某个 Unit 的所有底层参数
systemctl show docker.service
# 列出一个Unit的所有依赖(service也是一个Unit)
systemctl list-dependencies docker.service
systemctl list-dependencies --all docker.service #展开所有参数
注意:docker有两个service:docker.service和containerd.service。docker.service依赖于containerd.service。所以:
- 启动docker.service就会自动启动containerd.service。反之不行。
- 关闭containerd.service会自动关闭docker.service。反之不行。
服务名称可以省略.service。比如下边命令也是可以的:
systemctl start docker
开机自动启动服务命令
# 在开机时启用服务
systemctl enable docker.service
# 在开机时禁用服务
systemctl disable docker.service
# 查看服务是否开机启动
systemctl is-enabled docker.service
# 查看开机自启动的服务列表
systemctl list-unit-files | grep enabled
# 列出所有service的配置(是否自启动)
$ systemctl list-unit-files --type=service
查看当前系统服务状态列表
# 查看所有服务(无论是活动的、运行的、退出的或者是失败的)
systemctl --type=service #或者sudo
# 查看启动失败的服务列表
systemctl --failed
# 查看当前活动的服务列表
systemctl --type=service --state=active #或者systemctl list-units --type=service --state=active
# 查看当前正在运行的服务列表
systemctl --type=service --state=running #或者systemctl list-units --type=service --state=running
systemctl详细命令见http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html