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
版权归原作者 落落落sss 所有, 如有侵权,请联系我们删除。