Docker入门:快速安装与实战指南

文章目录

  • 一、快速入门
    • [1.1 安装Docker](#1.1 安装Docker)
    • [1.2 部署MySQL](#1.2 部署MySQL)
  • 二、Docker基础
    • [2.1 Docker常见命令](#2.1 Docker常见命令)
    • [2.2 数据卷](#2.2 数据卷)
    • [2.3 本地目录挂载](#2.3 本地目录挂载)
    • [2.4 自定义镜像与Docker File](#2.4 自定义镜像与Docker File)
    • [2.5 网络](#2.5 网络)
  • 三、项目部署
    • [3.1 部署java应用](#3.1 部署java应用)
    • [3.2 部署前端](#3.2 部署前端)
    • [3.3 DockerCompose](#3.3 DockerCompose)

一、快速入门

1.1 安装Docker

安装参考Docker官方文档:https://docs.docker.com/engine/install/centos
如果系统有旧版的Docker,则先卸载:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

配置Docker的yum库,首先安装yum工具:yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

执行命令,安装Docker:yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

查看版本:docker -v

查看:docker images(docker启动后可查看)

启动:systemctl start docker

停止:systemctl stop docker

设置开机自启:systemctl enable docker

查看docker:docker ps(如果不报错,说明安装启动成功)

配置镜像加速(以阿里云镜像加速为例)

注册阿里云账号:https://www.aliyun.com/

开通镜像服务:首页产品容器中找到阿里云的容器镜像服务,进入管理控制台,找到镜像工具、镜像加速器,从这复制加速器地址,参考操作文档配置https://cr/console.aliyun.com/cn-hangzhou/instances/mirrors

shell 复制代码
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirrors.aliyuncs.com"]
}
EOF
systemctl deamon-reload
systemctl restart docker

1.2 部署MySQL

先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_RO0T_PASSWORD=123 mysqL

命令解析

docker run:创建并运行一个容器
-d:是让容器在后台运行
--name mysql:给容器起个名字,必须唯一
-p 3306:3306:设置端口映射
-e KEY=VALUE:是设置环境变量
mysql:指定运行的镜像的名字(命名规范:[repository]:[tag],如:mysql:5.7)
部署nginx:docker run -d --name nginx -p 80:80 nginx

镜像和容器

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库 :存储和管理镜像的平台,Docker官方维护了一个公共仓库:http://hub.docker.com(海外网址)

二、Docker基础

2.1 Docker常见命令

Docker最常用的命令就是操作镜像、容器的命令,详官方文档:https://docs.docker.com

指令 含义
docker pull 镜像仓库拉取到本地镜像
docker push 本地推到镜像仓库
docker images 查看镜像是否下载成功(启动后可查看)
docker rmi 删除镜像
docker build 构建镜像(提前准备docker file)
docker save 镜像打包为压缩文件(供其他人员使用,--help可查看帮助)
docker load 镜像压缩包解压
docker run 创建并运行容器
docker stop 停止容器
docker start 启动容器
docker ps 查看容器运行状态
docker rm 删除容器
docker logs 查看日志
docker exec 进入容器内部

举例

拉取nginx镜像:docker pull nginx

查看本地镜像列表:docker images

容器打包为压缩包:docker save -o nginx.tar nginx:latest(压缩包可以直接解压使用)

删除镜像:docker rmi nginx:latest

查看本地镜像:docker images

解压读取镜像压缩包:docker load -i nginx.tar(通过docker save报错的压缩包)

创建并运行Nginx容器:docker run -d --name nginx -p 80:80 nginx

查看容器:docker ps

停止容器:docker stop

再次启动容器:docker start

查看日志:docker logs nginx

进入Nginx容器:docker exec -it nginx bash

删除容器:docker rm nginx

2.2 数据卷

案例 :利用Nginx容器部署静态资源
需求

创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化

将静态资源部署到nginx的html目录
进入容器:docker exec -it nginx bash

进入静态文件目录:cd /usr/share/nginx/html(里面有index.html)

使用vi修改文件时,发现无法使用vi指令

这里就要用到这节中的数据卷

数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

两者双向绑定,即在宿主机器中创建文件,容器对应的目录也会有对应的文件操作

命令 说明
docker volume --help 查看帮助
docker volume create 创建数据卷
docker volume ls 查看所欲数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷详情
docker volume prune 清除数据卷

提示

在执行docker run命令时,使用-v 数据卷:容器内目录可以完成数据卷挂载

当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
要完成案例对应的需求,进行如下操作

创建并启动nginx:docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx(-v指定数据卷映射)

查看数据卷:docker volume ls

查看html数据卷详细信息:docker volume inspect html(展示宿主机器对应位置)

进入宿主机器html的位置:cd /var/lib/docker/volumes/html/_data

查看当前路径信息:ls(发现当前有index.html文件,该文件是nginx的欢迎页)

修改该index.html内容后,页面访问nginx:192.168.0.101(发现访问的页面改了)
宿主机器与容器当中,只要有一边发生改动,另一侧会同步更新,两者双向映射

2.3 本地目录挂载

案例 :mysql容器的数据挂载
需求

查看mysql容器,判断是否有数据卷挂载

基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
提示

在执行docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载

本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
查看mysql是否挂载数据卷:docker inspect mysql(Mounts是挂载相关信息)(mysql自带匿名数据卷挂载)
挂载/root/mysql/data到容器内的/var/lib/mysql目录

挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本

挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
要完成案例对应的需求,进行如下操作

宿主机器创建目录:mkdir -p /mysql/{data,conf,init}cd /mysql

准备文件到目录:/mysql/config/config.cnf配置文件,/mysql/init/sql.sql数据库初始化脚本,如建表

创建并启动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/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/conf.d mysql
config.cnf配置文件内容如下

shell 复制代码
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

2.4 自定义镜像与Docker File

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
部署一个java应用的步骤:

准备一个Linux服务器

安装JRE并配置环境变量

拷贝Jar包

运行Jar包
构建一个java镜像的步骤:

准备一个Linux运行环境

安装JRE并配置环境变量

拷贝Jar包

编写运行脚本
入口:镜像运行入口,一般是程序启动的脚本和参数

层:添加安装包、依赖、配置等,每次操作都形成新的一层

基础镜像:应用依赖的系统函数、环境、配置、文件等

Docker File

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像指定目录 COPY ./jre.tar.gz /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN tar -zxvf /tmp/jre11.tar.gz&& EXPORTS path=/tmp/jre:$path
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

更新详细语法说明,请参考官网文档:https://docs.docker.com/engine/reference/builder
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构

shell 复制代码
#指定基础镜像
FROM ubuntu:16.04
#配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/uSr/local
#拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
#安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=$JAVA_DIR/jaVa8
ENV PATH=$PATH:$JAVA_HOME/bin
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

也可以直接基于JDK为基础镜像,省略前面的步骤

shell 复制代码
#基础镜像
FROM openjdk:11.0-jre-buster
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

编写好了Dockerfile,可以利用下面命令来构建镜像:docker build -t myImage:1.0 .
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
.:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
举例:提前准备docker-demo.jar包

shell 复制代码
#基础镜像
FROM openjdk:11.0-jre-buster
#设定时区
ENV TZ=Asia/Shanghai
RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像:docker build -t docker-demo .

运行:docker run -d --name dd -p 8080:8080 docker-demo

查看日志:docker logs -f dd

浏览器访问:xxx.xxx.xxx.xxx:8080

2.5 网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上

加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下

命令 说明
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息

查看所以网络:docker network ls

创建网络:docker network create demo

查看网卡:ip addr(发现多了个网卡)

容器加入网络:docker network connect demo mysql

查看mysql:docker inspect mysql(里面有新建的网络)

创建容器时就连接网络:docker run -d --name dd -p 8080:8080 --network demo docker-demo( --network demo指定demo网络)

查看:docker inspect dd(只有这一个网络,没有默认的虚拟网桥)

三、项目部署

3.1 部署java应用

需求:将demo-project项目打包为镜像并部署,镜像名demo-project
将项目打包target中的压缩包和dockerfile放到机器中

dockerfile内容如下:

shell 复制代码
#基础镜像
FROM openjdk:11.0-jre-buster
#设定时区
ENV TZ=Asia/Shanghai
RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone
#拷贝jar包
COPY demo-project.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像:docker build -t demo .

创建并启动容器:docker run -d --name demo-project -p 8080:8080 --network demo-network demo-project

查看日志:docker logs -f demo-project

3.2 部署前端

需求:创建一个新的nginx容器,准备nginx.conf(nginx的配置)、html目录与容器挂载

nginx.conf部分内容如下

shell 复制代码
http {
	include mime.types;
	default_type application/json;
	sendfile on;
	keepalive_timeout 65;

	server {
		listen 80;
		# 指定前端项目所在的位置
		location / {
			root /usr/share/nginx/html/demo-project;
		}

		error_page 599 592 593 594 /50x.html;
		location = /50x.html {
			root html;
		}
		# 后台接口配置
		location /api {
			rewrite /api/(.*) /$1 break;
			proxy_pass http://demo-project:8080;
		}
	}
}

把项目和nginx.conf发到机器中

创建并运行nginx:docker run -d --name nginx -p 80:80 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf --network demo nginx

3.3 DockerCompose

Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署
当前方式:docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_RO0T_PASSWORD=123 -v ./mysql/data:/var/lib/mysql -v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d --network demo mysql
DockerCompose方式创建,即yaml格式

yaml 复制代码
version: "3.8"
services:
	mysql:
		image: mysql
		container_name: mysql
		ports:
			- "3306:3306"
		environment:
			TZ: Asia/Shanghai
			MYSQL_RO0OT_PASSWORD: 123
		volumes:
			- "./mysql/conf:/etc/mysql/conf.d"
			-"./mysql/data:/var/lib/mysql"
			- "./mysql/init:/docker-entrypoint-initdb.d"
		networks:
			- demo

yaml多容器样式

yaml 复制代码
version: "3.8"
services:
	mysql:
		image: mysql
		container_name: mysql
		ports:
			- "3306:3306"
		environment:
			TZ: Asia/Shanghai
			MYSQL_RO0OT_PASSWORD: 123
		volumes:
			- "./mysql/conf:/etc/mysql/conf.d"
			-"./mysql/data:/var/lib/mysql"
			- "./mysql/init:/docker-entrypoint-initdb.d"
		networks:
			- demo
	demo-project:   # java应用程序
		build:
			context: .
			dockerfile: Dockerfile
		container_name: demo-project
		ports:
			- "8080:8080"
		networks:
			- demo
		depends_on:
			- mysql
		nginx:
			image: nginx
			container_name: nginx
			ports:
				- "80:80"
			volumes:
				- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
				- "./nginx/html:/usr/share/nginx/html"
			depends_on:
				- demo-project
			networks:
				- demo
	networks:
		demo-net:
			name: demo

指令格式:docker compose [OPTIONS] [COMMAND]

Options类型参数

参数或命令 说明
-f 指定compose文件的路径和名称
-p 指定project名称

Commands类型参数

参数或命令 说明
up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令

创建:docker compose up -d

查看:docker compose ps

网页可以访问

终止:docker compose down

查看:docker network ls

相关推荐
70asunflower2 小时前
Docker 镜像的完整内容解析
运维·docker·容器
sg_knight2 小时前
如何通过 SQL*Plus 连接 Oracle 数据库(使用 Instant Client)
运维·数据库·sql·oracle·database·关系型数据库·sql puls
API开发2 小时前
apiSQL网关 for Docker 离线安装和升级教程
运维·docker·容器·api·api网关·apisql·替代graphql
木子欢儿2 小时前
探索 OpenMediaVault 安装
linux·运维·服务器
Linux运维技术栈2 小时前
运维安全: SSH 公钥认证算法加固
linux·运维·安全
斯普信专业组2 小时前
Nacos-MCP 融合架构:运维nacos的MCP服务项目
运维·nacos·架构
小钻风33662 小时前
Docker入门基础知识(一)
运维·docker·容器
70asunflower2 小时前
Docker Daemon(Docker 守护进程)完全解析
docker·容器·eureka
小钻风33662 小时前
Docker入门基础知识(二)
运维·docker·容器