Docker

目录

docker原理

Docker如何解决不同系统环境的问题?

镜像:

容器:

Docker结构:

DockerHub:

Linux下载docker

第一步:卸载原来的docker(如果之前没有就不卸载)

第二步:安装yum工具

第三步:更新本地镜像源

第四步:输入命令安装docker-ce

启动docker

第一步:关闭防火墙

第二步:启动docker

配置镜像源加速

第一步:创建docker目录

第二步:在docker目录下创建daemon.json文件

第三步:加载daemon.json文件

操作docker镜像

1.查看docker的镜像

2.拉取镜像

3.把镜像打包成文件

4.删除镜像

5.从文件中加载镜像

示例

操作docker容器

创建并运行一个容器

进入容器执行操作

查看运行中的容器

查看所有的容器,包括停止的容器

暂停容器运行

取消暂停容器

停止容器

从静止到启动容器

删除容器

查看容器日志的命令

示例:

在docker启动redis

数据卷

创建数据卷

查看所有数据卷

查看数据卷详细信息卷

删除数据卷

示例

挂载数据卷

查看数据卷指向的宿主机目录

直接挂载宿主机目录

我们这里使用mysql来举例

第一步:关闭当前虚拟机正在运行的mysql,并设置开机不会自动启动

第二步:拉取mysql

第三步:创建要直接挂载的目录

第四步:创建容器并启动

[​编辑 第五步:测试连接](#编辑 第五步:测试连接)

DockerCompose

下载dockercompse

[修改文件权限 ,增加执行权限](#修改文件权限 ,增加执行权限)

增加Base自动补全命令

根据compose来创建并运行容器

注意:我们需要把正在运行的容器都删除

切换到yml文件所在目录

批量构建容器并启动


docker原理

Docker如何解决不同系统环境的问题?

1.Docker将某个软件的函数库 依赖以及配置文件进行打包

  • 2.Docker将当前软件与所需要调用的系统(比如Ubuntu)函数库一起打包
  • 3.Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行

镜像:

Docker将应用程序以及所需的依赖,函数库,环境,配置等文件打包在一起,称之为镜像

容器:

镜像中的应用程序运行后形成的进程就是容器,只是Docker会对容器进行隔离,对外不可见

一个镜像可以有多个容器

Docker结构:

Docker为cs结构

  • 服务端:接受命令或者远程请求,操作镜像或容器
  • 客户端:发送命令或者请求到Docker服务端

DockerHub:

一个镜像托管的服务器,这些服务器统称为DockerRegistry

Linux下载docker

第一步:卸载原来的docker(如果之前没有就不卸载)

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

第二步:安装yum工具

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

第三步:更新本地镜像源

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 添加docker镜像相关依赖    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 刷新缓存
yum makecache fast

第四步:输入命令安装docker-ce

yum install -y docker-ce

启动docker

第一步:关闭防火墙

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

第二步:启动docker

systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

systemctl status docker # 检查docker状态

systemctl enable docker # 设置docker服务开机自启
docker -v #查看docker版本

配置镜像源加速

第一步:创建docker目录

sudo mkdir -p /etc/docker

第二步:在docker目录下创建daemon.json文件

cd /etc/docker
vim daemon.json

在写文件中写:

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn",
    "https://mirror.baidubce.com"
  ]
}

第三步:加载daemon.json文件

sudo systemctl daemon-reload
sudo systemctl restart docker

操作docker镜像

1.查看docker的镜像

docker images

2.拉取镜像

docker pull 镜像名:tag  #不写tag默认是latest

3.把镜像打包成文件

docker save -o 文件名.tar 镜像名:tag  #不写tag默认是latest

4.删除镜像

docker rmi 镜像名:tag  #不写tag默认是latest

5.从文件中加载镜像

docker load -i 文件名.tar

示例

[root@localhost soft]# docker pull redis  #拉取redis最新版本
[root@localhost docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    5ef79149e0ec   3 days ago    188MB
redis        latest    dae83f665c92   2 weeks ago   117MB
[root@localhost soft]# docker save -o redis.tar redis:latest #打包
[root@localhost soft]# docker rmi redis #删除redis镜像
[root@localhost soft]# docker load -i redis.tar #加载redis镜像

操作docker容器

docker ps #查看所有运行中的容器以及其状态

创建并运行一个容器

docker run --name containName -p 80:80 -d nginx

docker run :创建并允许一个容器

--name:给容器起一个名字

-p:将宿主机端口号(Linux)于容器端口映射,冒号左边是宿主机端口号(外部通过这个端口号来访问),冒号右侧是容器端口

-d:后台运行容器

nginx:镜像名

[root@localhost soft]# docker ps  #查看所有运行中的容器以及其状态
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost soft]# docker images #查看所有镜像
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    5ef79149e0ec   3 days ago    188MB
redis        latest    dae83f665c92   2 weeks ago   117MB
[root@localhost soft]# docker run --name mng -p 80:80 -d nginx:latest
48b3e6fed1278bda5bbc7dde5843fd9f25dfff8acb5dff07720d4e881a2ec72c
[root@localhost soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                               NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   10 seconds ago   Up 9 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mng

进入容器执行操作

docker exec -it mng bash

docker exec:进入容器内步,执行一个目录

-it : 给当前进入的容器创建一个标准输入,输出终端,允许我们于容器交互

mng:要进入的容器的名字

bash:进入容器执行的命令,bash是一个linux终端交互命令,即可以在容器内部使用linux部分命令

使用eixt命令退出容器

查看运行中的容器

docker ps

查看所有的容器,包括停止的容器

docker ps -a

暂停容器运行

docker pause 容器名

取消暂停容器

docker unpause 容器名

停止容器

docker stop 容器名

从静止到启动容器

docker start 容器名

删除容器

docker rm 容器名 #只能删除停止运行的容器,不能删除运行中的容器
docker rm -f 容器名 #可以删除运行中的容器

查看容器日志的命令

docker logs 容器名
docker logs -f 容器名 #持续查看容器日志

示例:

[root@localhost soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                               NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   10 seconds ago   Up 9 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mng
[root@localhost soft]# docker pause mng
mng
[root@localhost soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                   PORTS                               NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   14 minutes ago   Up 14 minutes (Paused)   0.0.0.0:80->80/tcp, :::80->80/tcp   mng
[root@localhost soft]# docker unpause mng
mng
[root@localhost soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                               NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   14 minutes ago   Up 14 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   mng
[root@localhost soft]# docker stop mng
mng
[root@localhost soft]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost soft]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                        PORTS     NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   16 minutes ago   Exited (137) 46 seconds ago             mng
[root@localhost soft]# docker start mng
mng
[root@localhost soft]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                               NAMES
48b3e6fed127   nginx:latest   "/docker-entrypoint...."   16 minutes ago   Up 20 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mng

在docker启动redis

docker run --name re -p 6379:6379 -d redis redis-server --appendonly yes

redis-server 启动server

--appendonly yes:使用AOF持久化数据

数据卷

数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录

数据卷可以关联者宿主机文件和多个容器的文件

这样一来可以通过改变宿主机文件内容来修改 多个容器内文件的内容

作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

创建数据卷

docker volume create html(数据卷名)

查看所有数据卷

docker volume ls

查看数据卷详细信息卷

docker volume inspect html

删除数据卷

docker volume rm html

示例

[root@localhost soft]# docker volume create html
html
[root@localhost soft]# docker volume ls
DRIVER    VOLUME NAME
local     8cde3122c90e52a272b60ca9e264aebe7e0e94ac3f387adff7c32cd252a20551
local     084fcc577a0a264d73b1b5db87ec9cf4dbb10fd5247ddc2b4a7cbd76a12edabd
local     07188ec000d9c50f2a7e4b386a8a4964841e4aa43eecd752bc88ffb827cf9049
local     html
[root@localhost soft]# docker volume inspect html
[
    {
        "CreatedAt": "2024-08-18T17:02:02+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data", #指向的宿主机目录,里面没有内容
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]

挂载数据卷

 docker run --name ng -p 80:80 -v html:/usr/share/nginx/html -d nginx

-v html:/usr/share/nginx/html

-v为挂载数据卷的参数,html是要挂载数据卷的名字,/usr/share/nginx/html是容器中html文件的目录,这样一来容器中html文件就与数据卷相互绑定

注意:如果没有html这个数据卷,这个数据卷会自己创建出来

查看数据卷指向的宿主机目录

[root@localhost _data]# docker volume inspect html
[
    {
        "CreatedAt": "2024-08-18T17:02:02+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost _data]# cd /var/lib/docker/volumes/html/_data
[root@localhost _data]# ll
总用量 8
-rw-r--r--. 1 root root 497 8月  12 22:21 50x.html
-rw-r--r--. 1 root root 632 8月  18 17:25 index.html

我们可以发现原来数据卷指向目录的内容增加了,说明已经把容器内html文件映射到宿主机的这个目录当中了,接下来我们就可以自行修改index.html页面的内容

成功修改

直接挂载宿主机目录

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上

关联的关系如下:

1.带数据卷模式:宿主机目录->数据卷->容器内目录

2.直接挂载模式:宿主机目录->容器内目录

我们这里使用mysql来举例

第一步:关闭当前虚拟机正在运行的mysql,并设置开机不会自动启动
[root@localhost volumes]# systemctl stop mysqld
[root@localhost volumes]# systemctl disable mysqld
Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service.
[root@localhost volumes]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html

8月 18 15:18:00 localhost.localdomain systemd[1]: Starting MySQL Server...
8月 18 15:18:12 localhost.localdomain systemd[1]: Started MySQL Server.
8月 18 17:44:47 localhost.localdomain systemd[1]: Stopping MySQL Server...
8月 18 17:44:49 localhost.localdomain systemd[1]: Stopped MySQL Server.
第二步:拉取mysql
docker pull mysql:5.7.25
第三步:创建要直接挂载的目录
mkdir -p /tmp/mysql/data
第四步:创建容器并启动
docker run --restart=always -p 3306:3306 --name mysql -v /tmp/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7.25

说明:
	1.--restart=always 表示当Docker重启时,当前mysql容器总是重启容器.如果不加,docker重启,mysql不会重启
	2.-p 3306:3306 :port ,冒号前面的表示宿主机的端口号,冒号右边的表示mysql容器端口号
	3.--name mysql 表示当前的容器名
	4.-v /tmp/mysql/data:/var/lib/mysql
		1)-v [宿主机目录]:[容器内目录] 
		2)/tmp/mysql/data 表示宿主机目录
		3)/var/lib/mysql 表示data在容器中的位置,这个目录是通过dockerhub官方查看的
第五步:测试连接
mysql -h192.168.230.100 -P3306 -uroot -p1234

DockerCompose

DockerCompose可以基于Compose文件帮我们快速部署分布式应用,而无需一个个创建和运行容器

Compose文件是一个文本文件,通过指令定义集群中每个容器如何运行

下载dockercompse

curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改文件权限 ,增加执行权限

chmod +x /usr/local/bin/docker-compose

增加Base自动补全命令

1.需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

2.补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

# 查看系统中是否已经包含命令补齐脚本
ls  /usr/share/bash-completion/completions/docker*
# 下载自动补齐工具
yum -y install bash-completion
# 让自动补齐功能生效
source /usr/share/bash-completion/completions/docker
source /usr/share/bash-completion/bash_completion

根据compose来创建并运行容器

现在有一个compose-docker文件夹

yml文件内容

myweb-service文件夹是自己创建的镜像

Dockerfile文件,这是让这个jar包生成镜像的

注意:我们需要把正在运行的容器都删除

[root@localhost docker-compose]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED       STATUS                   PORTS                                                  NAMES
d545413832e7   mysql:5.7.25   "docker-entrypoint.s..."   4 hours ago   Up 34 minutes            0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
06db946465df   redis          "docker-entrypoint.s..."   5 hours ago   Exited (0) 3 hours ago                                                          re
[root@localhost docker-compose]# docker rm -f mysql re
mysql
re
[root@localhost docker-compose]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

切换到yml文件所在目录

[root@localhost tmp]# cd docker-compose/
[root@localhost docker-compose]# pwd
/tmp/docker-compose
[root@localhost docker-compose]# ll
总用量 4
-rw-r--r--. 1 root root 434 8月  18 21:35 docker-compose.yml
drwxr-xr-x. 2 root root  39 8月  18 21:35 myweb-service
[root@localhost docker-compose]# 

批量构建容器并启动

docker-compose up -d

up 表示创建并允许容器

-d 表示在后台运行

[root@localhost docker-compose]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
5a676401d482   myweb:3.0      "/bin/sh -c 'java -j..."   13 seconds ago   Up 11 seconds   0.0.0.0:8082->8090/tcp, :::8082->8090/tcp              myweb_container
7c7382af3ce0   mysql:5.7.25   "docker-entrypoint.s..."   13 seconds ago   Up 11 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_container

生成了myweb镜像

[root@localhost data]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
myweb        3.0       765afd42f281   25 minutes ago   552MB
nginx        latest    5ef79149e0ec   3 days ago       188MB
tomcat       latest    70dd81c409f9   11 days ago      461MB
redis        latest    dae83f665c92   2 weeks ago      117MB
mysql        5.7.25    98455b9624a9   5 years ago      372MB
相关推荐
Lemon_man_7 分钟前
基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
python·mysql·django
张晋涛12 分钟前
KCD 北京站丨云原生与AI的双向奔赴,超强Speakers阵容公开
云原生·aigc·线下活动
Hellc00731 分钟前
使用 Docker 部署 RabbitMQ 并实现数据持久化
docker·rabbitmq·ruby
Charary36 分钟前
字符设备驱动开发与杂项开发
linux·驱动开发
梦游钓鱼1 小时前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v1 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
钢板兽2 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
byxdaz2 小时前
NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南
linux·人工智能·深度学习
A仔不会笑2 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化