docker简单入门
- 🤚我的博客
- 🥛前言
- docker安装
- 🔷常见命令
- 镜像命令
- 容器命令
- 其他命令
- docker部署mysql容器
- docker数据卷
- 🔷挂载数据卷
- 🔷本地目录挂载
- 创建一个自定义Docker镜像
- 🔷镜像文件
- 🔷构建镜像
- 容器网络互连
- 🔷容器网络
- docker-compose
- 命令
- 实战
- 🔷已经部署过的MySQL的修改
- 加入到组网
- 执行主机sql文件
- 🔷配置一个nginx前端转发
- 🔷配置后端服务
- END
- 🔷公众号
🤚我的博客
- 欢迎光临我的博客:
https://blog.csdn.net/qq_52434217?type=blog
🥛前言
最近学了docker,就顺便记录一下学习过程中的心得和bug。
docker安装
🔷常见命令
1、卸载
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
2、安装工具
sudo yum install -y yum-utils
3、利用阿里云安装脚手架
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
4、启动和校验
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启
systemctl restart docker
# 开机自启
systemctl enable docker
5、配置docker镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://XXXXXXXXXXX.mirror.aliyuncs.com"]
}
EOF
6、重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像命令
1、拉取镜像
docker pull 镜像 名字
2、查看本地镜像
docker images
docker image ls
3、删除镜像
docker rmi image_name
4、加载本地镜像
docker load -i image_name.tar
5、保存镜像到本地
docker save
容器命令
1、创建并运行容器
# 后台运行
docker run -d --name container_name -p 80:80 --network custom_net
# 交互式运行
docker run -it
2、查看docker容器运行状态
docker ps -a
docker ps --all
docker ps -p
dokcer ps --quiet
3、启动停止的容器
docker start container_name
4、停止运行的容器
docker stop container_name
5、删除容器
docker rm
6、进入容器内部执行
docker exec -it container_name bash
# 进入container_name中用bash终端执行
7、重命名容器
docker
其他命令
1、查看容器日志
dokcer logs -f container_name
2、查看容器具体内容
docker inspect container_name
3、进入到正在运行的容器
docker exec -it container_name bash
docker exec -it container_name /bin/bash
4、拷贝主机文件到容器中
docker cp /path/to/file container_name:/path/tp/file
docker部署mysql容器
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
docker run
:创建容器并运行
-d
:容器后台运行
--name
:给容器起名字,必须唯一
-p
:端口映射,前面的端口是主机端口,后面的端口是容器端口
-e
:环境变量,由镜像制作者决定
mysql
:拉取和运行的镜像的名字,可以带上版本号mysql: 5.6
docker数据卷
数据卷是主机与容器之间的映射桥梁
以nginx
为例,我们需要指定nginx
的html
目录下index.html
文件
🔷挂载数据卷
挂载数据卷是指容器的文件指向主机,是一个文件映射关系
docker rm -f nginx
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
html
:数据卷的名字
查看数据卷列表
docker volume ls
删除卷
docker volume volume_name
展示数据卷的详细信息
docker volume inspect volume_name
🔷本地目录挂载
本地目录与容器数据卷的区别是,数据卷为一个名字,而本地目录为路径,需要加上路径修饰符/
。
下面示例是挂载一些配置文件
docker run \
-d \
--name mysql\
-p 3306:3306 \
-v /root/mysql/data:/var/lib/mysql \
/root/mysql/init:/docker-entrypoint-initdb.d \
/root/mysql/conf:/etc/mysql/conf.d
创建一个自定义Docker镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
-
部署一个java应用的步骤:
1、 准备一个Linux服务器
2、安装JRE并配置环境变量
3、拷贝jar包
4、运行jar包
-
镜像结构
1、层(layer),用于添加安装包、依赖、配置等,每次操作都形成新的层
2、基础镜像(BaseImage),应用以来的系统含数据、环境、配置、文件等
3、入口(entrypoint),镜像运行入口,一般是程序启动的脚本和参数
🔷镜像文件
镜像文件中有一些常见的指令用于构造镜像环境,[Dockerfile镜像指令|https://docs.docker.com/reference/dockerfile/](Dockerfile reference | Docker Docs)
- Dockerfile示例
# 基础镜像
FROM openjdk:11.0-jre-buster
#设定容器内部时区
ENV TZ=Asia/Shanghai
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java","-jar","/app/jar"]
🔷构建镜像
docker build -t image_name:1.0 .
-t
:给镜像起名,格式为image_name:tag
,不指定tag
时默认为latest
.
:指定Dockerfile的所在目录,表示在当前目录则为.
容器网络互连
🔷容器网络
容器网络可以帮助我们快速的建立容器之间的连接。在docker
中容器的名字就可以作为容器中虚拟ip地址使用,大大简单了容器网络的连接方式。即使是在后面的compose
中也是使用容器名字或者服务名字作为入口从而可以更简单的搭建多容器服务。
- 创建网络
docker network create network_name
- 查看网络
docker network ls
- 连接网络
docker network connect network_name container_name
启动时连接
docker run -d \
--name container_name \
-p real_port:docker_port \
--network network_name image_name
docker-compose
Docker Compose
通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
一般来说一个compose对应一个项目
version: "3.8"
services:
mysql:
image:mysql
container_name:mysql
ports:
- "3306:3306"
enviroment:
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"
networks:
-hm-net
hmall:
build:
context: .
dockerfile:Dockerfile
container_name:hmall
ports:
-"8080:8080"
networks:
-hm-net
depends-on:
-mysql
nginx:
image:nginx
container_name:nginx
ports:
- "18080:18080"
- "18081:18081"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name:hmall
depends_on
是指在docker容器中存在的变量
如nginx
配置中的proxy_pass
参数中hmall
,就是由compose
传入的,而depends_on变量传入的值便是容器中的虚拟ip地址。
server {
listen 80;
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hmall:8080;
}
}
命令
实战
🔷已经部署过的MySQL的修改
加入到组网
- 创建组网
- 中断mysql原来的组网
- 加入到新的组网
docker network create vinta_blog_net
docker network disconnet bridge
docker network connect vinta_blog_net
由于在创建容器时会加入一个默认组网,而这个组网的网关有可能是未知的。如果是未知的可能要删除容器并重新创建,而如果已知,比如我输入docker inspect mysql
查看mysql
容器信息会发现已经加入了一个网关为172.17.0.1
的名为bridge的组网,这时可以中断连接。
输入命令查看网关配置
docker network inspect vinta_blog_net
可以发现vinta_blog_net
组网中包含了一个名字为mysql
的容器,其地址为172.18.0.2
执行主机sql文件
- 复制主机文件到容器中
- 执行复制到容器中的sql文件
docker cp /usr/project/Thririve_Api_master/thirive.sql mysql:thirive.sql
docker exec -it mysql bash
mysql -uroot -p
# input your password
# The database vinta is used in project
create database vinta
use vinta
source /thirive.sql
依次执行上面的代码即可完成sql数据库和数据表的建立
🔷配置一个nginx前端转发
- 拉取一个新的镜像
- 创建容器并指定数据卷映射
# 停止已经运行的nginx服务,注意是服务不是容器
# 如果没有,则不用执行
sudo systemctl stop nginx
# sudo nginx -s stop
docker pull nginx
docker run -d --name nginx -p 80:80 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/project/dist:/usr/share/nginx/html --network vinta_blog_net nginx
依次执行上面的代码即可完成配置
这里需要注意如果需要转发后端接口,只需要将ip地址填写为容器名字即可
如想将前端请求的/api
转发到后端的5000
端口,则只需要填写为http://backend-container-name:5000
即可。
另外需要注意的是,由于nginx容器会生成一个默认的配置文件default.conf
,这个配置文件在conf.d
文件夹下,如果你想将本地数据卷挂载到自定义的文件夹下,需要注释掉nginx.conf
中的default.conf
文件的导入。
这里贴出nginx的配置
🔷配置后端服务
- 打包项目文件并上传到服务器
- 编写Dockerfile
- 创建docker镜像
- 创建docker容器并加入到组网运行
由于打包文件比较简单这里不再赘述
- 编写Dockerfile
# 基本镜像环境
FROM python:3.10
# 创建工作目录
WORKON /vinta
# 把当前目录的所有文件复制到 /vinta下
COPY . /vinta
RUN pip3 install -r requirements.txt -i https://mirrors.bfsu.edu.cn/pypi/web/simple/
EXPOSE 5000
CMD ["python3", "app.py"]
- 创建docker镜像
docker build -t vinta-blog-frontend .
- 创建docker容器并加入到组网运行
docker run -d --name vinta_blog_frontend -p 5000:5000 --network vinta_blog_net vinta-blog-frontend
END
至此,就完成了docker简单入门。文中提到的资料可以私信我领取!
🔷公众号
欢迎关注小夜的公众号,一个什么都会一点的研究生。