Docker技术学习.md

Docker技术学习.md

oyxy2019 262 2022-11-02

Docker技术学习

尚硅谷2022版Docker实战教程:https://www.bilibili.com/video/BV1gr4y1U7CY

Docker的三要素:镜像、容器、仓库

镜像(Image) 就是一个只读的模板。一个镜像可以用来创建很多个容器。

容器(Container) 可以把容器看作是一个简易版的Linux环境(包括用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库(Repository) 是集中存放镜像文件的地方 Docker Hub

Docker架构

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