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
相关推荐
昌sit!2 分钟前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
Peter_chq10 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml433 分钟前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
追风林1 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
一坨阿亮1 小时前
Linux 使用中的问题
linux·运维
dsywws2 小时前
Linux学习笔记之vim入门
linux·笔记·学习
A ?Charis3 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
幺零九零零3 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
Hsu_kk3 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境3 小时前
第02章 MySQL环境搭建
数据库·mysql