20220624-Linux-Docker
前言
目前我已经拥有了2台linux服务器,后续为了项目之间的隔离以及软件的快速部署和应用,docker不可或缺.
后续的应用场景: windows编写代码–>使用docker制作镜像–>部署到服务器进行运行
那么学习目标就是掌握windows及linux版本Docker安装及常用方法, windows端镜像制作
简介
Docker是一个应用打包,分发,部署的工具.
相对于VMware的虚拟机, Docker只会在操作系统上虚拟运行环境, 而VMVare则会在硬件上虚拟一整套操作系统.因而Docker 拥有更好的性能,更高的稳定性
桌面版Docker,服务器版Docker
桌面版Docker; 一般在windows使用, 既可以通过图形化页面进行交互,也可直接使用命令
服务器版Docker: 一般在linux使用, 只可使用命令交互
打包,分发,部署
打包: 将应用本身及其所需依赖,第三方库,打包成一个安装包
分发: 将安装包上传到镜像仓库,其他人可远程获取安装
部署: 使用docker命令一键部署运行应用
镜像,容器,仓库
镜像(Image) : 相当于”安装包”, 可以通过镜像创建多个容器实例
容器(Container): 一个运行时环境,通过镜像创建
仓库(Repository): 用于保存镜像,用于镜像的分发
sequenceDiagram Container ->> Image: 打包(commit) Image ->> Respository: 分发_上传(push) Respository ->> Image: 分发_下载(pull) Image ->> Container: 部署(run)
安装
windows桌面版安装
主要参照教程: 💻 Docker 快速安装软件 - Docker 快速入门 - 易文档 (easydoc.net)
教程非常详细,这边只做简单总结
graph LR Docker桌面版安装 --> windows功能启动Windows虚拟化和Linux子系统--> 命令行安装Ubuntu--> 安装新版WSL2-->设置Docker镜像
Linux版安装
主要参照官网安装教程: Install Docker Engine on CentOS | Docker Documentation
我使用仓库方式安装,下载docker有点慢(16min),可以尝试使用docker加速器或者其他教程
sudo yum install -y yum-utils # 安装yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 加入docker仓库
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安装最新版本docker
sudo systemctl start docker # 启动docker服务
sudo docker run hello-world # 测试安装是否成功
更换国内加速源
cd /etc/docker/
vim daemon.json # 编辑daemon.json ,修改加速源地址
~
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"]
}
~
sudo systemctl daemon-reload # 重启daemon-reload
sudo systemctl restart docker # 重启docker
TODO 使用docker打包部署flask+uwsgi+nginx
Mac安装
需要提前安装brew环境
$ brew install --cask --appdir=/Applications docker
手动打开docker应用, 按照提示同意协议, 输入密码,docker就可以使用了
参照:MacOS Docker 安装 | 菜鸟教程 (runoob.com)
Docker命令
常用命令
# 镜像操作
docker search tomcat # 搜索tomcat的镜像
docker pull tomcat: xx # 下载 tomcat的xx版本的奖项,不指定版本则下载最新版
docker images # 查看本地镜像列表
docker rmi $image_id # 删除镜像,id支持模糊输入
# 容器操作
docker ps # 查看当前运行的容器 -a 代表展示所有状态容器, -q代表只展示容器id(用于快速删除)
docker create --name=tomcat1 tomcat # 通过镜像tomcat创建容器tomcat1,并返回容器id(用的较少)
docker start tomcat1 # 运行容器tomcat1
docker restart tomcat1 # 重启容器tomcat1
docker stop tomcat1 # 停止容器tomcat1
docekr rm $container_id # 删除一个非运行状态的容器, id支持模糊输入, -f强制删除
docker rm -f $(docker ps -a) # 删除所有容器
docker exec -it $container_id/$container_name [commnd] # 在运行的容器内输入命令
docker exec -it $container_id/$container_name /bin/bash # 进入运行容器中的终端
docker cp logs/ sdh-nginx:/etc/nginx/logs/ # 复制文件进容器 docker cp $本机地址 $container_name:$容器地址
# 异常排除
docker logs $container_id # 查看容器启动日志
打包
准备
进入Docker Hub注册账户,并记住用户名
通过容器制作镜像
# 1. 准备容器基底
docker search centos ;docker pull centos:lastest
docker run -it centos:lastest /bin/bash # 创建centos的一个容器,并进入容器中的虚拟终端
# 2. 修改容器
... # 修改centos镜像,参照Reference Error: 修改centos镜像地址
yum install git
exit # 退出容器虚拟终端
# 3.制作镜像
docker commit -m "centos with git" -a "feny" 611 feny/centos:git
# docker commit -m "$提交信息" -a "$作者信息" $容器id $DockerHub用户名/$容器名:$Tag名
# 将容器只作为指定名称的镜像,注意,用户名称一定要与Dockerhub上一致,否则无法push
利用Dockerfile创建镜像
Dockerfile方法
将容器制作镜像方法的操作,写入到Dokcerfile中,一键执行Dockfile快速生成对应镜像
制作Dockerfile
vim Dockerfile
FROM fenylau/centos:git # 以镜像fenylau/centos:git为底
MAINTAINER fenylau # 维护者信息
RUN yum update # 自动更新yum工具
RUN yum install -y python3 # 安装python3(注意:-y表示自动统一所有提醒,一定要加上)
COPY ./* /usr/share/gitdir/ # 将当前目录文件copy到容器/usr/share/gitdir/ (一定要是文件夹路径)
使用Dockerfile制作镜像
docker build -t=fenylau/centos:python3 .
# 制作镜像 指定镜像名 fenylau/centos, tag为python3 .表示在当前路径搜索Dockerfile
分发
DockerHub分发
# 上传镜像
docker login
... # 按提示输入Dockerhub用户名及密码
docker push feny/cenos:git
# 下载镜像(奇怪的是无法使用docker search搜索到我的镜像)
docker pull feny/cenos:git
压缩包分发
docker save -o docker-image-centos-python3.tar fenylau/centos:python3
# 下载镜像 通过outstream写入文件 压缩包命名 需要保存的镜像
... # 通过xftp等工具分享镜像压缩包
docker load -i .\docker-image-centos-python3.tar
# 加载镜像 使用inputstream读取 压缩包名称
windows在DockerHub下拉镜像速度0.5m~1m/s,通过xftp下载镜像压缩包0.7m/s,2种方法下载速度差距不大
部署
docker run方式部署
通过宿主机中的文件路径和容器内文件路径, 可以非常方便的在web服务器部署war包
docker run语法
docker run # 创建运行容器
-i # 运行容器
-d # 后台运行
-v # 目录挂载
-p 主机端口: 容器应用端口 # 端口映射 , 容器应用端口应该和容器配置文件中指定端口一致(一般直接使用默认端口)
-t # 为容器分配一个虚拟终端
--name=$容器名 # 指定容器名
$imageName/$imageId # 镜像名称
/bin/bash # 进入虚拟终端,搭配-it使用,不与-d一起使用
docker run运行tomcat
# 1.进入一个已有容器确认挂载路径
docker exec -it tomcat1 /bin/bash # 进入容器tomcat1文件目录
cd /usr/local/tomcat/webapps # 查找被挂载目录
exit # 退出容器目录查看
... # 宿主机设置挂载目录
docker run -id --name=tomcat2 -p 6060:8080 -v E:\docker\tomcat\webapps:/usr/local/tomcat/webapps tomcat
# 使用镜像tomcat创建并后台运行容器tomcat2, 容器端口8080映射到宿主机6060端口, E:\docker\tomcat\webapps存放的文件映射到 # 容器/usr/local/tomcat/webapps tomcat
docker run -id --name=sdh --privileged=true centos:7 /usr/sbin/init # 特权方式启动 可以启动docker的特权模式,这种模式允许我们以其宿主机具有(几乎)所有能力来运行容器,包括一些内核特性和设备访问。
docker-compose方式部署
可通过yml文件, 部署和管理多个容器
新建docker-compose.yml
version: '3'
services:
grafana2:
image: grafana/grafana:9.5.3
ports:
- '3000:3000'
environment:
GF_RENDERING_SERVER_URL: http://renderer:8081/render
GF_RENDERING_CALLBACK_URL: http://grafana:3000/
GF_LOG_FILTERS: rendering:debug
renderer:
image: grafana/grafana-image-renderer:latest
ports:
- 8081
networks:
existing_network:
external:
name: grafana
执行
docker-compose --version # 查看docker-compose版本是否安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 安装docker-compose工具
sudo chmod +x /usr/local/bin/docker-compose
echo $PATH # 确保 /usr/local/bin 路径已添加到系统的可执行路径中
docker-compose up # 开始部署容器
Reference
docker官方镜像仓库: https://hub.docker.com/
主要参照文档: 💻 Docker 快速安装软件 - Docker 快速入门 - 易文档 (easydoc.net)
主要参照文档2: 只要一小时,零基础入门Docker - 知乎 (zhihu.com)
docker run命令详解: Docker run 命令 | 菜鸟教程 (runoob.com)
视频教程: 软件测试领域必备的docker技能_哔哩哔哩_bilibili
Docker加速器: (61条消息) Docker加速器的两种方法_yjssjm的博客-CSDN博客_docker加速器
centos配置docker国内加速源头: (61条消息) Docker配置国内加速镜像源_Roc-xb的博客-CSDN博客_docker加速源
修改centos镜像地址 : (61条消息) 【已解决】Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist_华仔仔coding的博客-CSDN博客