Docker技术学习
尚硅谷2022版Docker实战教程:https://www.bilibili.com/video/BV1gr4y1U7CY
Docker的三要素:镜像、容器、仓库
镜像(Image) 就是一个只读的模板。一个镜像可以用来创建很多个容器。
容器(Container) 可以把容器看作是一个简易版的Linux环境(包括用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(Repository) 是集中存放镜像文件的地方 Docker Hub
CentOS7安装Docker引擎
官网文档:https://docs.docker.com/engine/install/centos/
安装:
#安装yum-utils包
sudo yum install -y yum-utils
#设置存储库
sudo yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装最新版本的 Docker Engine、containerd 和 Docker Compose
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#启动 Docker
sudo systemctl start docker
#运行 hello-world 镜像验证
sudo docker run hello-world
卸载:
sudo systemctl stop docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
阿里云镜像加速器配置:
https://promotion.aliyun.com/ntms/act/kubernetes.html
弹性计算 -> 容器服务 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
Docker常用命令
帮助启动类命令
启动Docker:systemctl start docker
停止Docker:systemctl stop docker
重启Docker:systemctl restart docker
查看Docker状态:systemctl status docker
开机自启:systemctl enable docker
Docker帮助文档:docker --help
查看命令帮助文档:docker <具体命令> --help
镜像命令
列出本地主机上的镜像:docker images
搜索hub上的镜像:docker search [--limit 25] <镜像名称>
下载镜像:docker pull <镜像名称>[:TAG版本号] 省略为最新
查看镜像/容器/数据卷所占的空间:docker system df
删除本地镜像:docker rmi -f <镜像名称>
删除全部:docker rmi -f $(docker images -qa)
容器命令
有镜像才能创建容器,本例用ubuntu演示
docker pull ubuntu
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
--name='容器新名字' 为容器指定一个名称
-大写P 随机端口映射
-小写p 指定端口映射
-d 后台运行容器,也即启动守护式容器
-it 启动交互式容器,伪终端,举例:
docker run -it ubuntu /bin/bash
docker run -it --name=myu1 ubuntu bash
两种退出交互式容器的方式
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
列出当前所有正在运行的容器
docker ps [OPTIONS]
参数说明:
-a 列出正在运行的+历史运行过的容器
-l 显示最近创建的容器
-n 显示最近创建的n个容器
-q 静默模式,只显示容器编号
启动容器:docker start 容器ID|容器名
重启容器:docker restart 容器ID|容器名
停止容器:docker stop 容器ID|容器名
强制停止:docker kill 容器ID|容器名
删除容器:docker rm [-f] 容器ID|容器名
查看容器日志:docker logs 容器ID
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID
进入正在运行中的容器并以命令行交互:
docker exec -it 容器ID <BashShell>
docker attach 容器ID
上述两个区别:
attach直接进入容器启动命令的终端,不会新开一个终端,用exit退出容器也会停止
exec是在容器中打开一个新的终端,用exit退出不会导致容器的停止(推荐)
从容器内拷贝文件到宿主机上
docker cp <容器ID:路径> <目的主机路径>
导出容器(备份)
docker export 容器ID > 文件名.tar
导入容器
cat 文件名.tar | docker import - <镜像用户/镜像名:版本号>
镜像仓库
制作自己的镜像
docker commit -m="提交信息" -a="作者" 容器ID 目标镜像名[:版本号TAG]
将本地镜像推送到阿里云
https://cr.console.aliyun.com/cn-shanghai/instances
容器镜像服务 -> 个人实例 -> 创建命名空间 -> 创建镜像仓库
docker私有库
视频链接:https://www.bilibili.com/video/BV1gr4y1U7CY?p=28
容器数据卷
运行一个带有容器卷存储功能的容器实例(类似于宿主机和容器之间的共享文件夹?):
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷挂载情况:
docker inspect 容器ID 输出内容中的"Mounts"
添加容器卷读写规则,容器实例内部被限制,只能读不能写(默认不加为rw)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
创建新容器时,容器卷规则继承:
docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu
坑:不要忘了 --privileged=true
常规软件安装
视频链接:https://www.bilibili.com/video/BV1gr4y1U7CY?p=34
tomcat安装
docker hub上查找镜像并拉取
docker pull tomcat
docker images tomcat
运行镜像
docker run -d -p 8080:8080 --name t1 tomcat
docker ps
问题:访问猫页面失败,可能是tomcat最新版的原因
解决:把webapps.dist目录重命名为webapps
mysql安装
简单版
docker hub上查找镜像并拉取
docker pull mysql:5.7
docker images
启动镜像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注意3306端口有没有被原来的MySQL占用,查看命令 ps -ef|grep mysql
docker ps
测试
docker exec -it 容器ID /bin/bash
mysql -u root -p
mysql> show databases
mysql> create database db01;
mysql> use db01
mysql> create table t1(id int, name varchar(20));
mysql> insert into t1 values(1, 'zhang3');
mysql> select * from t1;
问题1:插入中文报错
解决:mysql中执行SHOW VARIABLES LIKE 'character%'
问题2:数据随容器被删而消失
解决:容器数据卷,如下实战版所示
实战版
启动镜像
docker run -d -p 3306:3306 --privileged=true \
-v /oyxy2019/mysql/log:/var/log/mysql \
-v /oyxy2019/mysql/data:/var/lib/mysql \
-v /oyxy2019/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
docker ps
修改my.cnf配置文件
cd /oyxy2019/mysql/conf
vim my.cnf
####内容如下####
[client]
default_character_set = utf8
[mysqld]
collation_server = utf8_general
character_set_server = utf8
##############
cat my.cnf
docker restart mysql
测试
docker exec -it mysql /bin/bash
mysql -u root -p
mysql> SHOW VARIABLES LIKE 'character%'
mysql> show databases;
mysql> create database db01;
mysql> use db01;
mysql> create table t1(id int, name varchar(20));
mysql> insert into t1 values(1, 'zhang3');
mysql> select * from t1;
redis常规安装
在宿主机下新建目录/app/redis
mkdir -p mkdir -p
将一个redis.conf文件模板拷贝进/app/redis目录中并修改
https://www.bilibili.com/video/BV1gr4y1U7CY?p=39&share_source=copy_web&vd_source=5241e3d310611caa27708a1946574933&t=320
运行镜像创建容器
docker run -p 6379:6379 --name myr3 --privileged=true \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 redis-server /etc/redis/redis.conf
docker ps
docker exec -it myr3 /bin/bash
测试
redis-cli
set k1 v1
get k1