Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux
容器解决方案。
而 Linux
容器是 Linux
发展出了另一种虚拟化技术,简单来讲, Linux
容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker
将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker
,就不用担心环境问题。
总体来说, Docker
的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1)image镜像: docker镜像就是一个只读模板,比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,另外docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下一个已经做好的镜像来直接使用
2)container容器 :docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序
3)repostory仓库 :仓库是集中存储镜像文件的沧桑,registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag) 仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下载,国内的docker pool,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务。
Docker基础安装及常用环境配置使用 Docker环境安装- 安装
yum-utils
:
yum install -y yum-utils device-mapper-persistent-data lvm2
-
为yum源添加docker仓库位置:
使用官方源地址(比较慢)可以更换repo地址到国内的镜像
阿里云镜像: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker:
yum install docker-ce
- 启动docker:
systemctl start docker
Docker系统常用命令
Docker镜像常用命令
搜索镜像
docker search java
下载镜像
docker pull java:8
查看镜像版本
由于
docker search
命令只能查找出是否有该镜像,不能找到该镜像支持的版本,所以我们需要通过Docker Hub
来搜索支持的版本。
- 进入
Docker Hub
的官网,地址:https://hub.docker.com - 然后搜索需要的镜像:
- 查看镜像支持的版本:
- 进行镜像的下载操作:
docker pull nginx:1.17.0
列出镜像
docker images
删除镜像
- 指定名称删除镜像:
docker rmi java:8
- 指定名称删除镜像(强制):
docker rmi -f java:8
- 删除所有没有引用的镜像:
docker rmi `docker images | grep none | awk '{print $3}'`
- 强制删除所有镜像:
docker rmi -f $(docker images)
打包镜像
# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile文件
docker build -t mall/mall-admin:1.0-SNAPSHOT .
推送镜像
# 登录Docker Hub
docker login
# 给本地镜像打标签为远程仓库名称
docker tag mall/mall-admin:1.0-SNAPSHOT macrodocker/mall-admin:1.0-SNAPSHOT
# 推送到远程仓库
docker push macrodocker/mall-admin:1.0-SNAPSHOT
Docker容器常用命令
新建并启动容器
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx:1.17.0
- -p:将宿主机和容器端口进行映射,格式为:宿主机端口:容器端口;
- --name:指定容器名称,之后可以通过容器名称来操作容器;
- -e:设置容器的环境变量,这里设置的是时区;
- -v:将宿主机上的文件挂载到宿主机上,格式为:宿主机文件目录:容器文件目录;
- -d:表示容器以后台方式运行。
- 列出运行中的容器:
docker ps
- 列出所有容器:
docker ps -a
停止容器
注意:$ContainerName
表示容器名称,$ContainerId
表示容器ID,可以使用容器名称的命令,基本也支持使用容器ID,比如下面的停止容器命令。
docker stop $ContainerName(or $ContainerId)
例如:
docker stop nginx
#或者
docker stop c5f5d5125587
启动容器
docker start $ContainerName
删除容器
- 删除指定容器:
docker rm $ContainerName
查看容器的日志
- 查看容器产生的全部日志:
docker logs $ContainerName
- 动态查看容器产生的日志:
docker logs -f $ContainerName
查看容器资源占用状况
- 查看指定容器资源占用状况,比如cpu、内存、网络、io状态:
docker stats $ContainerName
- 查看所有容器资源占用情况:
docker stats -a
查看容器磁盘使用情况
docker system df
执行容器内部命令
docker exec -it $ContainerName /bin/bash
MySQL安装
- 下载MySQL
5.7
的docker镜像:
docker pull mysql:5.7
- 使用如下命令启动MySQL服务:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 参数说明
- -p 3306:3306:将容器的3306端口映射到主机的3306端口
- -v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂在到主机
- -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
- -v /mydata/mysql/data:/var/lib/mysql/:将数据文件夹挂载到主机
- -e MYSQL_ROOT_PASSWORD=root:初始化root用户的密码
- 进入运行MySQL的docker容器:
docker exec -it mysql /bin/bash
- 使用MySQL命令打开客户端:
mysql -uroot -proot --default-character-set=utf8
- 创建mall数据库:
create database mall character set utf8
- 安装上传下载插件,并将
document/sql/mall.sql
上传到Linux服务器上:
yum -y install lrzsz
- 将
mall.sql
文件拷贝到mysql容器的/
目录下:
docker cp /mydata/mall.sql mysql:/
- 将sql文件导入到数据库:
use mall;
source /mall.sql;
- 创建一个
reader:123456
帐号并修改权限,使得任何ip都能访问:
grant all privileges on *.* to 'reader' @'%' identified by '123456';
Redis安装
- 下载Redis
5.0
的docker镜像:
docker pull redis:5
- 使用如下命令启动Redis服务:
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-d redis:5 redis-server --appendonly yes
- 进入Redis容器使用
redis-cli
命令进行连接:
docker exec -it redis redis-cli
Nginx安装
- 下载Nginx
1.10
的docker镜像:
docker pull nginx:1.10
- 先运行一次容器(为了拷贝配置文件):
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-d nginx:1.10
- 将容器内的配置文件拷贝到指定目录:
docker container cp nginx:/etc/nginx /mydata/nginx/
- 修改文件名称:
mv nginx conf
- 终止并删除容器:
docker stop nginx
docker rm nginx
- 使用如下命令启动Nginx服务:
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
RabbitMQ安装
- 下载rabbitmq
3.7.15
的docker镜像:
docker pull rabbitmq:3.7.15
- 使用如下命令启动RabbitMQ服务:
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-d rabbitmq:3.7.15
- 进入容器并开启管理功能:
docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management
Springboot整合Docker打包
Docker开启2375端口配合Spirngboot Maven打包插件实现镜像上传
前提条件:
1.安装好docker后开启2375端口 用于springboot远程连接实现镜像上传,此方案存在风险,一般只推荐测试环境使用。
2.Springboot配置maven插件
pom核心插件配置服务器地址及插件
<properties>
<java.version>1.8</java.version>
<docker.host>http://127.0.0.1:2375</docker.host>
<docker.maven.plugin.version>1.2.2</docker.maven.plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--Docker 打包插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.plugin.version}</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>mall/${project.artifactId}:${project.version}</imageName>
<dockerHost>${docker.host}</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar" ,"/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
正常打包
服务器查看镜像
springboot项目启动
docker run -p 8080:8080 --name springboottest --link mysql:db -d mall/springboot-mybatis-plus:0.0.1-SNAPSHOT
直接访问端口即可测试接口