docker是什么
Docker 是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在本地编译测试通过的容器可以批量地在生产环境中部署。
docker的三个基本概念
镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
容器就是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等 。
仓库(Repository)
仓库就是集中存放镜像文件的地方,镜像需要从仓库中下载。
总结 (重点)
打个比方,仓库相当于手机中的应用商店,商店里面的app相当于镜像,镜像下载安装后,启动的app相当于 容器, 不过app是运行在手机操作系统上,而容器是运行在 docker的容器引擎上而不是Linux等操作系统上。
docker在实际工作中的好处
可以极大的减少服务部署,环境搭建的时间成本和人力成本
在CentOS7 中安装docker
1、先安装依赖软件
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
3、安装docker
yum install -y docker-ce
注意:
centos8默认使用podman代替docker,所以需要下载containerd.io,在执行安装步骤。
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
4.启动docker
service docker start
查看docker的版本,如果正常说明安装成功
docker -v
关闭docker:
service docker stop
重启docker:
service docker restart
docker开机自启:
systemctl enable docker.service
下载镜像
docker pull nginx
或者
docker pull nginx:1.18.0
解释: docker pull 就是下载镜像,后面跟镜像名称, 名称后面加 : 代表下载指定的版本,如果不指定版本,则是下载当前最新的版本
查看已有的镜像
docker images
删除镜像
docker rmi 镜像ID 或者 镜像名称:版本
docker run
docker run
命令用于从镜像中创建一个新容器,该命令参数比较多,下面列举几个常用的参数
参数
-d: 后台运行容器,并返回容器ID;
-v 宿主机目录:容器中的目录: 挂载目录,将容器中的目录映射到宿主机中
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-e username="ritchie": 设置环境变量;
--name nginx1.18: 为容器指定一个名称;
--link mysql:mysql: 添加链接到另一个容器;
实战讲解
下载nginx镜像并创建容器
下载镜像: docker pull nginx:1.18.0
使用run 命令创建容器
docker run -p 81:80 --name nginx1 -d nginx:1.18.0
-p 81:80 : 将容器中的80端口,映射到宿主机81端口
--name nginx1 : 指定容器名称为 nginx1
-d : 创建后 容器在后台运行,并打印容器的id
nginx:1.18.0 : 指明运行的镜像
查看81端口
curl 127.0.0.1:81
如果出现 html 说明,容器创建并启动成功,nginx1容器的80端口已经映射到宿主机(centos7)的81端口
实战2
使用run 命令再创建一个nginx容器,并挂载nginx的配置文件,html,日志 等目录
1、新建 /home/docker/nginx/ 目录,并进入此目录
mkdir -p /home/docker/nginx/
cd /home/docker/nginx/
2.1、首先从nginx1容器中将配置文件给复制出来(因为配置文件是启动容器所必须的,必须先准备好才能启动容器)
docker container cp nginx1:/etc/nginx .
命令详解:
docker container cp : 从容器中复制文件出来
nginx1:/etc/nginx : 容器名称:要复制的目录
.(点) : 复制出来的地址即 当前目录
2.2重命名nginx文件夹名称为 conf :
mv nginx conf
2.3查看配置文件 :
ls /conf
2.4再复制一下nginx1容器的html文件夹
docker container cp nginx1:/usr/share/nginx/html .
3.1、创建容器并挂载目录
docker run -p 82:80 --name nginx2 -v /home/docker/nginx/conf:/etc/nginx -v /home/docker/nginx/html:/usr/share/nginx/html -v /home/docker/nginx/log:/var/log/nginx -d nginx:1.18.0
或者
docker run -p 82:80 \--name nginx2 \-v /home/docker/nginx/conf:/etc/nginx \-v /home/docker/nginx/html:/usr/share/nginx/html \-v /home/docker/nginx/log:/var/log/nginx \-d nginx:1.18.0
命令详解:
-p 82:80 : 将容器中的80端口,映射到宿主机82端口(因为81已被占用)
–name nginx2 : 指定容器名称为 nginx2 (容器不能重名)
-v /home/docker/nginx/conf:/etc/nginx : 将容器中的目录/etc/nginx 挂载到 宿主机 /home/docker/nginx/conf 目录下
-v /home/docker/nginx/html:/usr/share/nginx/html : 将容器中的目录/usr/share/nginx/html挂载到 宿主机 /home/docker/nginx/html目录下
-v /home/docker/nginx/log:/var/log/nginx : 将容器中的/var/log/nginx 挂载到宿主机/mydate/nginx/log目录下
-d : 启动后 容器在后台运行,并打印容器的id
nginx:1.18.0 : 指明运行的镜像
4.1、查看nginx2容器是否成功 出现 html 说明成功
curl 127.0.0.1:82
4.2、修改宿主机 /home/docker/nginx/html/index.html文件,并再次查看
vim /home/docker/nginx/html/index.html
curl 127.0.0.1:82
可以看到,修改的内容已生效,这就是挂载目录的作用,不用修改容器内的文件,挂载目录后直接再宿主机目录操作即可
查看nginx的日志
cat /home/docker/nginx/log/access.logimage.png
挂载日志目录后,直接在宿主机查看nginx日志即可,与容器中的日志是一样的
容器管理
容器的操作主要有 启停,删除,新建,查看日志,查看状态等等,上节课已经学习了 容器的创建,就是docker run 命令。
查看运行中的容器
docker ps
命令输出内容详解:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED:容器的创建时间。
STATUS: 容器状态及时间。(Up About an hour: 运行了大约一个小时)
PORTS:容器的端口信息和端口映射情况。
NAMES: 自动分配的容器名称。
停止容器
语法:
docker stop 容器名称/容器ID
停止容器 nginx1 docker stop nginx1 通过容器ID停止容器 nginx2 docker stop
86f7221d1a3a
查看所有容器
docker ps -a
加上-a参数,会展示所有容器(运行的,未运行的都会展示出来)
删除容器
docker rm 容器名/容器ID
启动容器
docker start 容器名/容器ID
重启容器
docker restart 容器名/容器ID
docker 安装mysql
1、下载mysql 5.7镜像
docker pull mysql:5.7
使用docker run 命令创建容器
docker run -p 3306:3306 --name mysql -v /home/docker/mysql/log:/var/log/mysql -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -e TZ="Asia/Shanghai" -d mysql:5.7
或者
docker run -p 3306:3306 \--name mysql \-v /home/docker/mysql/log:/var/log/mysql \-v /home/docker/mysql/data:/var/lib/mysql \-v /home/docker/mysql/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=123456 \-e TZ="Asia/Shanghai" \-d mysql:5.7
命令详解:
-p 3306:3306:将主机的3306端口映射到容器的3306端口
-v /home/docker/mysql/conf:/etc/mysql:将配置文件夹挂在到主机
-v /home/docker/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
-v /home/docker/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQLROOTPASSWORD=123456:初始化root用户的密码
-e TZ=“Asia/Shanghai” : 指定时区
2、进入mysql设置root账号可以远程访问
docker exec -it mysql mysql -uroot -p123456
#启动容器时密码设置的什么,-p后面就跟什么
设置root账号远程访问 123456 就是 设置的密码
grant all privileges on *.* to 'root'@'%' identified by '123456';
image.png
刷新权限并退出
flush privileges; exit
开放linux端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
重载防火墙
firewall-cmd --reload
docker安装Redis
1、下载redis镜像
docker pull redis:6.0.5
2、创建redis 容器
docker run -p 6379:6379 --name redis -v /home/docker/redis/data:/data -d redis:6.0.5 --appendonly yes --requirepass "123456"
或者
docker run -p 6379:6379 \--name redis \-v /home/docker/redis/data:/data \-d redis:6.0.5 \--appendonly yes --requirepass "123456"
命令详解
-v /home/docker/redis/data:/data : 挂载数据目录
–appendonly yes --requirepass “123456” :开启数据持久化,密码设置为 123456
3、开启Linux端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
4、重载防火墙
firewall-cmd --reload
查看容器的日志
docker logs 容器名称
参数:
-f :实时打印日志
--tail=n: 打印最新的n条日志
-t: 打印日志时带上时间戳
例如:
查看mysql容器的日志
dockr logs mysql
查看mysql容器最近的3条日志
docker logs --tail=3 mysql
进入容器内部
docker exec -it 容器名称 /bin/bash
实战:
进入mysql 容器:
docker exec -it mysql /bin/bash
容器必须是启动状态才可进入
退出容器 exit
通常不需要进入容器工作,如果需要修改容器的某些配置文件和环境,可能会用到此命令