一、安装docker
参考官方文档:https://docs.docker.com/engine/install/centos/
查看系统版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]#
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]#
1.卸载docker旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.配置Docker的yum库
首先要安装一个yum工具
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.安装Docker
最后,执行命令,安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
查看安装的版本
docker -v
4.启动和校验
# 启动Docker
systemctl start docker
# 查看Docker的状态
systemctl status docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 关闭开机自启动
systemctl disable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
5.配置镜像加速
这里以阿里云镜像加速为例。
5.1 注册阿里云账号
首先访问阿里云网站:
https://www.aliyun.com/
注册一个账号。
5.2 开通镜像服务
在首页的产品中,找到阿里云的容器镜像服务 :
点击后进入控制台:
首次可能需要选择立刻开通,然后进入控制台。
5.3 配置镜像加速
找到镜像工具 下的镜像加速器 :
具体命令
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
# 查看配置是否生效
docker info|grep Mirrors -A 1
二、了解镜像和容器
1.镜像和容器
DockerHub:https://hub-stage.docker.com/
官方(需要翻墙):https://hub.docker.com/
2.命令解读
以mysql为例:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
3.镜像命名规范
三、快速入门
1.常见命令
2.实践案例一
2.1 案例需求
2.2 搜索镜像
进入官方的
或者
https://hub.docker.com/u/library
或者命令搜索
#搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
例如:
docker search dvwa
2.3 拉取镜像
docker输入这个命令进行拉取镜像
docker pull nginx
2.4 查看镜像
docker images
2.5 保存镜像到本地
保存镜像到本地
查看帮助
docker save -o --help
保存镜像
docker save -o nginx.tar nginx:latest
2.6 删除镜像
docker rmi 镜像名:版本
例如:
docker rmi nginx:latest
2.7 本地拉取镜像
查看帮助
docker load --help
本地拉取镜像
docker load -i nginx.tar
或者
docker load -i nginx.tar -q
2.8 创建容器
docker run -d --name nginx -p 80:80 nginx
-i,以交互模式运行容器,通常与 -t 同时使用
-t,启动容器后,为容器分配一个命令行,通常与-i同时使用
-v,目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d,守护进程,后台运行该容器
-p,指定端口映射,格式:主机(宿主)端口:容器端口
-P,随机端口映射,容器内部端口随机映射到主机的端口
-u,以什么用户身份创建容器
--name "nginx-lb",容器名字
-m, --memory bytes,设置容器使用内存最大值
-h, --hostname string,指定容器的 host name
--dns 8.8.8.8,指定容器 dns 服务器
-e username="ritchie",设置环境变量
--restart,Docker 重启后,容器是否自动重启
--privileged,容器内是否使用真正的 root 权限
2.9 查看容器
docker ps :会列出出正在运行的容器信息。
docker ps -a :会列出当前服务器中所有的容器,无论是否在运行。
CONTAINER ID:每个容器的唯一标识符号,自动生成。类似于数据库中的主键。
IMAGE :创建容器使用的镜像名称。
COMMAND:运行容器时的命令。
CREATED:容器创建的时间。
STATUS:容器的运行状态,Up 17 hours 指容器已运行17小时。
docker ps -s:会列出容器的文件大小(容器增加的大小/容器的虚拟大小)
docker ps -q:仅列出CONTAINER ID 字段
如批量停止所有容器:docker stop docker ps -a -q
docker ps -l: 显示最后一个运行的容器(无论该容器目前处于什么状态)
docker ps -n 数量x:显示最后 x 个运行容器,当x为1时和 -l 含义相同。(无论该容器目前处于什么状态)
docker ps --no-trunc:不对输出进行截断操作,此时可以看到完整的COMMAND,CONTAINER ID
docker -f :使用过滤器来过滤输出
目前支持过滤器:
id (容器的id)
label
name(容器名称)
exited (整数-容器退出状态码,只有在使用-all才有用)
status 容器状态(created,restarting,running,paused,exited,dead)
ancestor 过滤从指定镜像创建的容器
before (容器的名称或id),过滤在给定id或名称之后创建的容器
isolation (default process hyperv) (windows daemon only)
volume (数据卷名称或挂载点),--过滤挂载有指定数据卷的容器
network(网络id或名称),过滤连接到指定网络的容器
示例:
docker ps -f status=exited
docker ps -f ancestor=597ce1600cf4 -f status=exited -a
docker ps --formart {{.Names}}:以go的形式格式化输出列表
go模板
.ID 容器的ID
.Image 镜像的ID
.Command 容器启动的命令
.CreatedAt 创建容器的时间点
.RunngingFor 从容器创建到现在过去的时间
.Ports 暴露的端口
.Status 容器的状态
.Size 容器硬盘的大小
.Names 容器的名称
.Label 指定label的值
.Mounts 挂载到这个容器的数据卷名称
示例:
docker ps --formart {{.Names}}---{{.Image}}
docker ps
或者查看所有的容器
docker ps -a
自定义查看容器信息
docker ps --format "table {{.ID}}\t{{.Image}}\{{.Ports}}\t{{.Status}}\t{{.Names}}"
2.10 停止容器
# 停止一个容器
docker stop 容器i或者容器名
# 停止所有容器
docker stop $(docker ps -q)
- docker ps -q:列出所有运行中容器的ID。
- docker stop:停止一个或多个运行中的容器。
示例一:
docker stop nginx
示例二:
2.11 启动容器
docker start nginx
2.12 查看日志
docker logs nginx
或者一直查看
docker logs -f nginx
2.13 进入容器
说明:-it参数是可交互的模式 bash是命令行模式
docker exec -it nginx bash
2.14 退出容器
exit
2.15 删除容器
删除所有容器
docker rm $(docker ps -aq)
- docker ps -aq:列出所有容器(包括未运行的)的ID。
- docker rm:移除一个或多个容器。
删除单个容器
docker rm 容器id(或者容器名)
或者用-f操作强制删除
docker rm -f 容器id(或者容器名)
示例一:
docker rm nginx
注意:
删除容器的时候,如果不强行删除的话,需要先停止容器
docker stop nginx
示例二:
docker rm $(docker ps -aq)
四、配置Docker国内源
可用源
●Docker 官方中国区:https://registry.docker-cn.com
●网易:http://hub-mirror.c.163.com
●中国科技大学:https://docker.mirrors.ustc.edu.cn
●阿里云:https://y0qd3iq.mirror.aliyuncs.com
1.配置源文件
增加Docker的镜像源配置文件 /etc/docker/daemon.json
如果没有配置过镜像源该文件默认是不存在的
vim /etc/docker/daemon.json
在其中增加如下内容
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
2.重启docker
service docker restart
3.查看配置是否生效
docker info|grep Mirrors -A 1
五、逻辑卷
1.图解
2.基本命令
查看命令帮助信息
docker volume --help
3.实践案例二
3.1 创建逻辑卷和容器
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
3.2 查看逻辑卷位置
docker volume ls
查看具体位置
docker volume inspect html
那么以后在宿主机的这个目录下操作文件和在docker容器中操作是一样的效果
3.3 总结
4.实践案例三
mysql官方文档:https://hub-stage.docker.com/_/mysql
4.1 查看容器的详情
docker inspect 容器名(或者是ID)
docker inspect nginx
主要看Mounts的配置信息
"Mounts": [
{
"Type": "volume",
"Name": "html",
"Source": "/var/lib/docker/volumes/html/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
4.2 挂载目录
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
创建成功后
注意:在运行之前,需要创建这些目录
cd /root
mkdir mysql
cd mysql
mkdir data
mkdir conf
mkdir init
在conf目录下创建配置文件hm.cnf,代码如下
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
然后在init目录下创建数据信息hmall.cnf
4.3 验证数据持久保存
先删除容器
docker rm -f mysql
无法在连接数据库
但是数据还在宿主机上
再次重新创建容器
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
查看连接数据库,发现连接成功,并且数据都还在
六、自定义镜像
1.基础命令
官方文档:https://docs.docker.com/engine/reference/builder
2.构建解读
3.总结
七、网络
1.基本命令
2.创建网络
docker network create 网络名
例如:
docker network create hm
3.查看网络
docker network ls
4.将容器添加到网络
docker network connect 网络名 容器名
例如:
docker network connect hm mysql
5.查看容器信息
docker inspect mysql
八、Docker Compose
1.命令选项
build ------ 构建(重新构建)项目中的服务容器
config ------ 检测compose文件的错误
up ------ 启动服务
down ------ 停止容器
images ------ 列出项目中所包含的镜像
logs ------ 查看服务容器的日志
kill ------ 发送 SIGKILL 信号来强制停止服务容器
port ------ 查看某个容器端口所映射的公共端口
ps ------ 列出项目中目前的所有容器
restart ------ 重启项目中的服务
rm ------ 删除所有停止状态的服务容器
run ------ 在指定服务上运行一个命令
scale ------ 设置指定服务运行的容器个数
stop ------ 停止处于运行状态的容器
start ------ 启动被stop的服务容器
top ------ 查看各个服务容器内运行的进程
pause ------ 暂停一个服务容器
unpause ------ 恢复处于暂停状态中的服务
2.例子
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- new
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- new
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/etc/nginx/html"
depends_on:
- hmall
networks:
- new
networks:
new:
name: hmall