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

通常不需要进入容器工作,如果需要修改容器的某些配置文件和环境,可能会用到此命令