Docker

**镜像(Image)**:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

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

image-20230831163055046

DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。



image-20230831164232668



image-20230831163016417



安装

  • 卸载
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


  • 更新本地镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast



  • 安装docker
yum install -y docker-ce


  • 关闭防火墙

非服务器

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


  • 启动docker
systemctl start docker  # 启动docker服务

systemctl stop docker # 停止docker服务

systemctl restart docker # 重启docker服务


  • 配置镜像加速

阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://26pcmmm1.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker





镜像操作

  • docker [操作] –help :查看文档

  • 镜像名称一般分两部分组成:**[repository]:[tag]** :mysql:5.7

  • 在设有指定tag时,默认是latest,代表最新版本的镜像


操作命令

image-20230831195148267

#查看镜像
docker images

#删除镜像
docker rmi # docker rmi nginx:latest

#拉取镜像
docker pull # docker pull nginx

#推送镜像
docker push

#导出镜像
docker save #docker save -o nginx.tar nginx:latest

#读取镜像
docker load #docker load -i nginx.tar





容器

image-20230831205900781



创建运行容器

image-20230831210716121

#以nginx为例子,不同的容器启动需要看对于的文档
docker run --name cc -p 80:80 -d nginx #nginx


#redis 进入容器然后redis-cli 进行连接
docker run --name credis -p 6379:6379 -d redis redis-server --appendonly yes
#进入容器
docker exec -it 容器名称 bash

#查看容器状态--运行
docker ps # 添加 -a 查看所有状态的容器

#查看容器日志
docker logs

#停止容器
docker stop 容器名称
start
pause
unpause


#删除容器
docker rm 容器名称
docker rm -f 容器名称 #强制删除



修改容器的文件

#进入容器
docker exec -it 容器名称 bash
  • 因为容器只包含自己所需要的文件,所以对于编辑器 vim/vi 都是没有的

  • 例,修改nginx的index.html

sed -i 's#Welcome to nginx#这是修改的标题#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html


数据卷

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

  • 容器和数据卷进行关联,数据卷和本地文件系统进行关联 == 挂载,本地变化即影响容器对应的文件,双向绑定

image-20230901003330802


语法

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

在创建容器时,可以通过**-V**参数来挂载一个数据卷到某个容器目录

#   create 创建  一个volume
docker colume create 数据卷名称

# ls 显示所有的数据卷
docker colume ls

# inspect 显示数据卷的详细信息
docker volume inspect 数据卷

# prune 刪除未使用的volume
docker volume prune

# rm 删除一个或多个指定的volume
docker volume rm 数据卷


  • docker管理数据卷目录

例子:通过数据卷操作nginx的index.html文件:(nginx容器index.html文件路径:/usr/share/nginx/html内),把这个目录挂载到html这个数据卷(相当于目录)上,进行操作对应目录内的文件

#1、创建  增加 -v 数据卷名称:映射的地址目录
docker run --name cnginx -p 80:80 -v html:/usr/share/nginx/html -d nginx

#2、 查看数据卷的详细信息,查看Mountpoint数据卷位置
docker inspect html

#3、进入数据卷目录,发现和映射目录的文件内容一模一样【双向绑定】
cd /var/lib/docker/volumes/html/_data
ls


#对文件进行修改和保存,自动刷新
vi index.html


  • 自己管理目录挂载

  • image-20230901100240523

# -v [宿主文件]:[容器文件]
# -v [宿主目录]:[容器目录]

docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d mysql:5.7.25



  • 总结
  • image-20230901100535727





Dockerfile

  • 单个项目部署镜像

image-20230901101100630


构建镜像

1、创建目录

mkdir docker-demo

#把jar包、jdk、DockerFile(定义构建步骤:构建会根据这个文件内容进行构建)

Dockerfile

image-20230901104959856

# 指定基础镜像	#被人制作好的镜像(不用配置环境变量。。)
FROM java:8-alpine

COPY ./docker-demo.jar /tmp/app.jar #代构建的jar

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

2、构建

docker build -t javaweb:1.0 .

3、可查看镜像有没有运行,访问总结访问项目的端口即可

docker images





DockerCompose

  • 快速进行集群部署

image-20230901132940508

1、每个服务文件夹:jar(mave打包) +Dockerfile(定义构建镜像和添设置ar包位置)

#各服务对应的Dockerfile
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar

2、打包前 localhost 更改为 服务名称

#例如
server-addr: localhost:8848 #nacos地址
#server-addr: nacos:8848 #nacos地址

3、DockerCompose 文件

  • 类似 DockerFile的汇总
version: "3.2"

services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice: #打包好的服务
build: ./user-service #服务文件夹名称
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"

4、构建镜像

#定位到目录
docker-compose up -d

#重启微服务
docker-compose restart 服务.. .. gateway服务





镜像仓库


配置Docker信任地址

私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://自己IP:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker


图形化界面

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

  • 创建自定义目录
mkdir  registry-ui
  • 创建 docker-compose 文件
touch docker-compose.yml
  • 写入:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=Chne的仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry

  • 执行
docker-compose up -d
  • 访问
http://localhost:8080/


推送/拉取

推送镜像到私有镜像访问必须要先 tag(重命名)

1、重新tag本地镜像,名称前缀为私有仓库的地址:http://localhost:8080/

docker tag nginx:latest localhost:8080/nginx:1.0

2、推送镜像

docker push localhost:8080/nginx:1.0

3、拉取镜像

docker pull localhost:8080/nginx:1.0