❤️Linux下Docker环境安装
一、Docker环境安装
Docker是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
安装详细说明参考官方文档:https://docs.docker.com/get-docker,以CentOS为例。
1、安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
2、为yum源添加docker仓库位置
# 官方地址(比较慢)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云地址(国内地址,相对更快)
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker服务
yum install docker-ce docker-ce-cli containerd.io
4、启动docker服务
systemctl start docker
5、安装完成后,运行下面的命令,验证是否安装成功。
docker version # 查看Docker版本信息
systemctl start docker # 启动 docker 服务:
systemctl stop docker # 停止 docker 服务:
systemctl status docker # 查看 docker 服务状态
systemctl restart docker # 重启 docker 服务
6、镜像加速器
如果你的Docker镜像下载过慢或者无法下载的话,可以使用阿里云的镜像加速器。
- 首先我们需要登录阿里云,然后打开
控制台->容器镜像服务->镜像工具->镜像加速器
功能,复制加速器地址;
访问地址:进入容器镜像服务控制台创建加速器。
https://help.aliyun.com/document_detail/60750.html
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
使用配置文件/etc/docker/daemon.json(没有时新建该文件)。
vim /etc/docker/daemon.json
# 添加如下内容,可以自己替换。默认地址是我的创建的
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
重启Docker Daemon即可
systemctl daemon-reload
systemctl restart docker
二、Docker镜像常用命令
官方文档:https://docs.docker.com/reference
1、查看镜像
执行命令:docker images
属性 | 说明 |
---|---|
REPOSITORY | 镜像在仓库中的名称 |
TAG | 镜像标签 |
IMAGE ID | 镜像 ID |
CREATED | 镜像的创建日期 |
SIZE | 镜像大小 |
这些镜像都是存储在Docker
宿主机的/var/lib/docker
目录下。
2、搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索。
执行命令:docker search 镜像名称
属性 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像描述 |
STARS | 用户评价 |
OFFICIAL | 是否为官方构建 |
AUTOMATED | Docker Hub 自动构建 |
3、拉取镜像
拉取镜像就是从中央仓库下载镜像到本地。
执行命令:docker pull 镜像名称
如果不声明tag
镜像标签信息则默认拉取latest
版本。
docker pull openjdk:8
由于
docker search
命令只能查找出是否有该镜像,不能找到该镜像支持的版本,所以我们需要通过Docker Hub
来搜索支持的版本。
- 进入
Docker Hub
的官网,然后搜索需要的镜像,地址:https://hub.docker.com
查看镜像支持的版本
进行镜像的下载操作
docker pull nginx:1.17.0
4、删除镜像
- 按镜像
ID
(名称)删除单个镜像。
执行命令:docker rmi 镜像ID
- 按镜像
ID
删除多个镜像。
执行命令:docker rmi 镜像ID 镜像ID 镜像ID
docker images -q
可以查询到所有镜像的ID
,通过组合命令可以实现删除所有镜像的操作。
执行命令:docker rmi docker images -q
- 指定名称删除镜像:
docker rmi openjdk:8
- 指定名称删除镜像(强制):
docker rmi -f openjdk:8
- 删除所有没有引用的镜像:
docker rmi `docker images | grep none | awk '{print $3}'`
- 强制删除所有镜像:
docker rmi -f $(docker images)
提示
注意:如果通过某个镜像创建了容器,则该镜像无法删除。 解决办法:先删除镜像中的容器,再删除该镜像。
5、打包镜像
# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile文件
docker build -t mall/mall-admin:1.0-SNAPSHOT .
6、推送镜像
# 登录Docker Hub
docker login
# 给本地镜像打标签为远程仓库名称
docker tag mall/mall-admin:1.0-SNAPSHOT macrodocker/mall-admin:1.0-SNAPSHOT
# 推送到远程仓库
docker push macrodocker/mall-admin:1.0-SNAPSHOT
三、Docker容器常用命令
1、查看容器
- 查看正在运行的容器。
执行命令:docker ps
属性 | 说明 |
---|---|
CONTAINER ID | 容器 ID |
IMAGE | 所属镜像 |
COMMAND | 启动容器时运行的命令 |
CREATED | 创建时间 |
STATUS | 容器状态 |
PORTS | 端口 |
NAMES | 容器名称 |
- 查看停止的容器。
执行命令:docker ps -f status=exited
- 查看所有容器(包括运行和停止)。
执行命令:docker ps -a
- 查看最后一次运行的容器。
执行命令:docker ps -l
- 列出最近创建的 n 个容器。
执行命令:docker ps -n 5
2、创建与启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx:1.17.0
- -i:表示运行容器;
- -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;
- --name:为创建的容器命名;
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;
- -d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里);
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。
- -P:随机使用宿主机的可用端口与容器内暴露的端口映射。
3、创建并进入容器
下面这行命令的意思就是通过镜像 AA 创建一个容器 BB,运行容器并进入容器的/bin/bash
。
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
注意:Docker
容器运行必须有一个前台进程,如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
4、退出当前容器
exit
5、守护式方式创建容器
docker run -di --name 容器名称 镜像名称:标签
6、登录守护式容器方式
docker exec -it 容器名称|容器ID /bin/bash
7、停止与启动容器
# 停止容器
docker stop 容器名称|容器ID
# 启动容器
docker start 容器名称|容器ID
8、强制停止容器
docker kill 容器名称|容器ID
9、进入容器
先查询出容器的pid
docker inspect --format "{{.State.Pid}}" 容器名称|容器ID
根据容器的pid进入容器
nsenter --target "$pid" --mount --uts --ipc --net --pid
10、删除容器
# 删除指定容器
docker rm 容器名称|容器ID
# 删除多个容器
docker rm 容器名称|容器ID 容器名称|容器ID
按名称通配符删除容器,比如删除以名称mall-
开头的容器
docker rm `docker ps -a | grep mall-* | awk '{print $1}'`
强制删除所有容器
docker rm -f $(docker ps -a -q)
11、查看容器的日志
docker logs 容器名称|容器ID
12、动态查看容器产生的日志
docker logs -f 容器名称|容器ID
13、查看容器的IP地址
我们可以通过以下命令查看容器的元信息。
docker inspect 容器名称|容器ID
也可以直接执行下面的命令直接输出 IP 地址。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器名称|容器ID
14、修改容器的启动方式
# 将容器启动方式改为always
docker container update --restart=always 容器名称|容器ID
15、同步宿主机时间到容器
docker cp /etc/localtime $ContainerName:/etc/
16、指定容器时区
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-d nginx:1.17.0
17、查看容器资源占用状况
- 查看指定容器资源占用状况,比如cpu、内存、网络、io状态:
docker stats 容器名称|容器ID
- 查看所有容器资源占用情况:
docker stats -a
18、查看容器磁盘使用情况
docker system df
19、执行容器内部命令
docker exec -it $ContainerName /bin/bash
20、指定账号进入容器内部
# 使用root账号进入容器内部
docker exec -it --user root $ContainerName /bin/bash
21、查看所有网络
docker network ls
22、创建外部网络
docker network create -d bridge my-bridge-network
23、指定容器网络
docker run -p 80:80 --name nginx \
--network my-bridge-network \
-d nginx:1.17.0
24、修改镜像的存放位置
- 查看Docker镜像的存放位置:
docker info | grep "Docker Root Dir"
[root@linux-local ~]# docker info | grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
- 关闭Docker服务:
systemctl stop docker
- 先将原镜像目录移动到目标目录(如果没有则mkdir /mydata创建):
mv /var/lib/docker /mydata/docker
- 建立软连接:
ln -s /mydata/docker /var/lib/docker
- 再次查看可以发现镜像存放位置已经更改。
25、Docker容器清理
- 查看Docker占用的磁盘空间情况:
docker system df
- 删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
- 删除所有
dangling
镜像(没有Tag的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
- 删除所有
dangling
数据卷(即无用的 volume):
docker volume rm $(docker volume ls -qf dangling=true)
26、文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp
命令。
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来。
docker cp 容器名称:容器目录 需要拷贝的文件或目录
27、目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。
创建容器添加-v
参数,格式为宿主机目录:容器目录,例如:
docker run -di -v /home/ruoyi/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
提示
目录挂载操作可能会出现权限不足的提示。这是因为
CentOS7
中的安全模块SELinux
把权限禁掉了,在docker run
时通过--privileged=true
给该容器加权限来解决挂载的目录没有权限的问题。
- 匿名挂载
匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/lib/docker/volumes
中生成。
# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls
- 具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录会在/var/lib/docker/volume
中生成。
# 匿名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls
- 指定目录挂载
之前挂载方式就属于指定目录挂载,这种方式的挂载不会在/var/lib/docker/volume
目录生成内容。
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
- 查看目录挂载关系
通过docker volume inspect
数据卷名称 可以查看该数据卷对应宿主机的目录地址。
执行命令:docker volume inspect docker_centos_data
通过docker inspect
容器ID或名称 ,在返回的JSON
节点中找到Mounts
,可以查看详细的数据挂载信息。
- 只读/读写
# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名