我的操作系统centos7本地vm
基本操作总结
比较常见的命令有:
命令 | 说明 | 文档地址 |
---|---|---|
docker pull | 拉取镜像 | |
docker push | 推送镜像到DockerRegistry | |
docker images | 查看本地镜像 | |
docker rmi | 删除本地镜像 | |
docker run | 创建并运行容器(不能重复创建) | |
docker stop | 停止指定容器 | |
docker start | 启动指定容器 | |
docker restart | 重新启动容器 | |
docker rm | 删除指定容器 | |
docker ps | 查看容器 | |
docker logs | 查看容器运行日志 | |
docker exec | 进入容器 | |
docker save | 保存镜像到本地压缩文件 | |
docker load | 加载本地压缩文件到镜像 | |
docker inspect | 查看容器详细信息 |
默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
给常用Docker命令起别名,
方便我们访问:
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
然后,执行命令使别名生效
source /root/.bashrc
数据卷的相关命令有:
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | |
docker volume ls | 查看所有数据卷 | |
docker volume rm | 删除指定数据卷 | |
docker volume inspect | 查看某个数据卷的详情 | |
docker volume prune | 清除数据卷 |
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
dockerFile其中的语法比较多,比较常用的有:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 |
|
ENV | 设置环境变量,可在后面指令使用 |
|
COPY | 拷贝本地文件到镜像的指定目录 |
|
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
|
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
network常见命令有:
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | |
docker network ls | 查看所有网络 | |
docker network rm | 删除指定网络 | |
docker network prune | 清除未使用的网络 | |
docker network connect | 使指定容器连接加入某网络 | |
docker network disconnect | 使指定容器连接离开某网络 | |
docker network inspect | 查看网络详细信息 |
dockerCompose常见命令
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
-p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |
docker安装
1、卸载旧版本
如果系统中已经存在旧的Docker,则先卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、配置一个Docker的yum仓库
首先要安装一个yum工具
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装docker
执行命令,安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
阿里云安装使用
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
4、启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
5、配置镜像
注册阿里云账号
首先访问阿里云网站:阿里云-计算,为了无法计算的价值注册一个账号
在首页的产品中,找到阿里云的容器镜像服务:
页面向下滚动,即可找到配置的文档说明:
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
docker使用
安装mysql
docker run -d \
> --name mysql \
> -p 3306:3306 \
> -e TZ=Asia/Shanghai \
> -e MYSQL_ROOT_PASSWORD=123 \
> mysql
解读:
-
docker run -d
:创建并运行一个容器,-d
则是让容器以后台进程运行 -
--name
mysql
: 给容器起个名字叫mysql
,你可以叫别的 -
-p 3306:3306
: 设置端口映射。-
容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
-
容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
-
格式:
-p 宿主机端口:容器内端口
,示例中就是将宿主机的3306映射到容器内的3306端口
-
-
-
e
TZ=Asia/Shanghai
: 配置容器内进程运行时的一些参数-
格式:
-e KEY=VALUE
,KEY和VALUE都由容器内进程决定 -
案例中,
TZ=Asia/Shanghai
是设置时区;MYSQL_ROOT_PASSWORD=123
是设置MySQL默认密码
-
-
mysql
: 设置镜像名称,Docker会根据这个名字搜索并下载镜像-
格式:
REPOSITORY:TAG
,例如mysql:8.0
,其中REPOSITORY
可以理解为镜像名,TAG
是版本号 -
在未指定
TAG
的情况下,默认是最新版本,也就是mysql:latest
-
查看docker安装的容器
docker ps
docker 打包
docker save -o nginx.tar nginx:latest
删除镜像
docker rmi nginx:latest
加载
docker load -i nginx.tar
dockerfile构建镜像
docker build -t docker-demo .
查看镜像
docker images
创建容器并且运行
docker run -d --name nginx -p 80:80 nginx
查看进程
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
停止容器
docker stop nginx
查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
运行容器
docker start nginx
查看容器详细信息
docker inspect nginx
进入容器,查看容器内目录
docker exec -it nginx bash
查看容器中的目录
ls -l
退出
exit
进入MySQL并且使用mysql客户端
docker exec -it mysql mysql -uroot -p
删除容器
docker rm nginx
强制删除容器
docker rm -f nginx
查看日志
docker logs nginx
持续查看日志
docker logs -f nginx
起别名
vi ~/.bashrc
alias dps='docker ps --format "table{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{Status}}\t{{.Names}}"'
alias dis='docker images'
source ~/.bashrc
数据卷命令
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:
-
如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
-
MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
-
我想要让Nginx代理我的静态资源怎么办?
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:
-
html
:放置一些静态资源 -
conf
:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html
目录;如果我们要修改Nginx的配置,最好是找到conf
下的nginx.conf
文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。
在上图中:
-
我们创建了两个数据卷:
conf
、html
-
Nginx容器内部的
conf
目录和html
目录分别与两个数据卷关联。 -
而数据卷conf和html分别指向了宿主机的
/var/lib/docker/volumes/conf/_data
目录和/var/lib/docker/volumes/html/_data
目录
这样以来,容器内的conf
和html
目录就 与宿主机的conf
和html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data
就是在操作容器内的/usr/share/nginx/html/_data
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
创建数据卷
docker volume create
查看所有数据卷
docker volume ls
删除指定数据卷
docker volume rm
查看某个数据卷详情
docker volume inspect
清除数据卷
docker volume prune
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
cd /var/lib/docker/volumes/html/_data
mysql容器本地挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(
挂载/root/mysql/data到容器内的/var/lib/mysql目录 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
mkdir mysql
cd mysql/
mkdir data
mkdir conf
mkdir init
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
mysql
dockerfile自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
官网文档: https://docs.docker.com/engine/reference/builder
dockerfile构建镜像
docker build -t docker-demo .
运行镜像
docker run -d --name dd -p 8080:8080 docker-demo
查看日志 dd是容器名称
docker logs -f dd
网络网桥
创建网络
docker network create 网络名称
连接
docker network connect 网络名 容器名
容器创建并且连接网络
docker run -d --name 容器名称 -p 8080:8080 --network 网络名称 镜像名称
访问ping 容器名称
nginx 静态资源挂载
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network 网络名称\
nginx
Docker Compose
Docker Compose通过一个单独的docker-compose,yml 模板文件(YAML格式)来定义一组相关联的应用容器帮
助我们实现多个相互关联的Docker容器的快速部署。
docker-compose.yml
文件
# Docker Compose 文件版本,这里使用的是 3.8 版本
version: "3.8"
# 定义服务
services:
# MySQL 服务
mysql:
# 使用官方的 MySQL 镜像
image: mysql
# 设置容器的名称为 mysql
container_name: mysql
# 端口映射,将宿主机的 3306 端口映射到容器的 3306 端口
ports:
- "3306:3306"
# 环境变量,设置时区为中国上海,并设置 MySQL root 用户的密码为 123
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
# 卷挂载,将配置文件、数据文件和初始化脚本分别挂载到容器内的相应目录
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
# 将该服务连接到名为 hm-net 的网络
networks:
- hm-net
# 自定义服务 hmall
hmall:
# 使用当前目录下的 Dockerfile 构建镜像
build:
context: .
dockerfile: Dockerfile
# 设置容器的名称为 hmall
container_name: hmall
# 端口映射,将宿主机的 8080 端口映射到容器的 8080 端口
ports:
- "8080:8080"
# 将该服务连接到名为 hm-net 的网络
networks:
- hm-net
# 依赖 MySQL 服务,确保 MySQL 服务启动后再启动 hmall 服务
depends_on:
- mysql
# Nginx 服务
nginx:
# 使用官方的 Nginx 镜像
image: nginx
# 设置容器的名称为 nginx
container_name: nginx
# 端口映射,将宿主机的 18080 和 18081 端口分别映射到容器的 18080 和 18081 端口
ports:
- "18080:18080"
- "18081:18081"
# 卷挂载,将自定义的 Nginx 配置文件和 HTML 目录挂载到容器内的相应目录
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
# 依赖 hmall 服务,确保 hmall 服务启动后再启动 Nginx 服务
depends_on:
- hmall
# 将该服务连接到名为 hm-net 的网络
networks:
- hm-net
# 定义网络
networks:
# 创建一个名为 hm-net 的网络,并在服务的 networks 中引用它
hm-net:
# 设置网络的名称,这里使用 'hmall' 加上 '网络' 的描述性名称
name: hmall-net
运行
docker compose up -d
结束
docker compose down
项目部署流程
mysql数据卷自定义挂载
docker run -d \
--name 容器名称 \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \ //数据
-v /root/mysql/conf:/etc/mysql/conf.d \ //配置文件
-v /root/mysql/init:/docker-entrypoint-initdb.d \ //脚本
镜像名称
// mysql
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
mysql
创建网络
docker network create 网络名称
连接将要用的环境容器连接到同一个网络比如mysql容器
docker network connect 网络名 容器名
关键yml
项目打包mvn package
dockerfile
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
构建镜像
docker build -t 镜像名称 .
容器创建并且连接网络
docker run -d --name 容器名称 -p 8080:8080 --network 网络名称 镜像名称
nginx配置文件挂载
自己的静态资源放/root/nginx/html中
/root/nginx/下放nginx.conf
nginx 容器创建运行并且挂载网络连接
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network 网络名称\
nginx
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 18080;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/静态资源文件夹1;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://项目容器名称:8080;
}
}
server {
listen 18081;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/静态资源文件夹2;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://项目容器名称:8080;
}
}
}