docker简介
- docker是Linux版的软件中心,可大大简化应用的安装部署工作
- docker是轻量级的Linux,有自己的IP和端口,一个宿主机的多个容器可以构成局域网,可通过宿主机通过docker虚拟出来的网卡实现互通,外部访问容器,可通过端口映射的方式
几个概念
- docker服务:docker服务是运行在宿主机的后台进程,也称之为守护进程(Docker daemon)
- docker客户端:是用户命令入口,可接受用户命令和配置标识,并于docker服务通信,比如docker build就是 Docker客户端输入的
- 镜像Images:可以理解为下载器,使用镜像可以创建容器
- 容器Container:可以理解为软件,是通过镜像来实例化的
- 仓库(Registry):是一个集中存储镜像的服务,类似于Maven的仓库
docker安装
- 系统要求:Linux内核版本3.10以上
uname -r
# 查看当前内核版本yum -y update
# 更新yum包yum remove docker docker-common docker-selinux docker-engine
# 卸载旧版本yum install -y yum-utils device-mapper-persistent-data lvm2
# 下载工具和依赖yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 设置docker的yum源yum list docker-ce --showduplicates | sort -r
# 查看docker版本sudo yum install -y docker-ce
# 安装dockersystemctl start docker && systemctl enable docker
# 启动并设置开机自启docker version
# 查看是否安装成功,client和service都有表示docker安装成功- 阿里镜像加速:https://cr.console.aliyun.com/cn-hangzhou/mirrors
常用命令
docker search java
# 镜像搜索docker pull java:8
# 镜像下载docker images
# 镜像查看docker rmi java
# 镜像删除,也可指定镜像id删除,如:docker rmi d23bdf5b1b1bdocker run --name mynginx -d -p 81:80 docker.io/nginx
# 容器创建并启动- –name:容器名称
- -d:后台启动
- -p:端口映射
- e:启动参数(类似于命令行启动时的参数)
- -v:文件映射,如 -v /opt/nginx:/etc/nginx/nginx.conf
docker ps
# 容器查看docker ps -a
# 查看所有docker inspect mynginx
# 查看容器启动状态docker exec -it mynginx/bin/bash
进入到容器docker start/stop/restart mynginx
# 启动/停止/重启容器
构建自己docker镜像
- 自己构建docker还是比较复杂的,特别是一些成熟的软件,可能需要很多配置和依赖,此处就以springboot为例,构建自己的java程序镜像
- 打包时,需要指定可直接运行的插件,否则会报找不到主类的错误
<build> <plugins> <!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 将打好的jar包上传到虚拟机中,然后再Jar包同级目录创建Dockerfile文件,vi Dockerfile 添加如下内容:
FROM java:8 # 指定java8环境镜像 VOLUME /tmp # 默认文件挂载 ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar # 将jar添加到容器跟目录中 RUN bash -c 'touch /app.jar' EXPOSE 9000 # 暴露端口 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
- 使用docker build命令构建镜像:
docker build -t docker-springboot-0.0.1 .
(格式说明:.代表Dockerfile的相对位置) - 创建并启动容器:
docker run --name job7777 -d -p 7777:7777 -p 9997:9997 stu-job-0.0.1
需要开放哪些端口,我们就映射哪些端口 - 查看启动日志:
docker logs -tf --tail 20 job7777
docker-compose安装
-
介绍:是docker高效的容器管理工具,可定义、运行、停止多个容器
-
安装命令:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
-
查看是否安装成功:
docker-compose -v
-
构建docker-compose文件:`vi docker-compose.yml
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 build: /opt/module/Dockerfile # 指定镜像构建的Dockerfile文件 ports: - "81:80" # 指定映射端口
-
常用命令(注意:所有命令都必须在docker-compose.yml同级目录执行)
容器docker-compose up -d # 后台启动管理器 docker-compose ps # 查看此管理器下所有运行容器 docker-compose logs -f # 查看管理器日志输出 docker-compose build # 构建或重新构建管理器 docker-compose start mynginx # 启动管理器中已有的容器 docker-compose stop mynginx # 停止管理器中已有的容器 docker-compose rm mynginx # 删除管理器中已有的容器
docker-compose.yml详解
-
version:指定docker-compose.yml版本
-
services:容器服务的集合
-
build:容器构建参数,有两种指定Dockerfile方式
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #build: /opt/module/Dockerfile # 指定镜像构建的Dockerfile文件 build: context: /opt/module dockerfile: Dockerfile args: # 构建参数 buildno: 1
-
command:自定义容器启动时的命令
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #command: java -jar app.jar # 自定义容器启动命令 command: [jave, -jar, app.jar]
-
dns:配置DNS服务器
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #dns: 114.114.114.114 dns: - 8.8.8.8 - 114.114.114.114
-
dns_search:配置DNS搜索域
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
-
environment:环境变量的配置
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 environment: #RACK_ENV: development #SHOW: 'ture' - RACK_ENV=development - SHOW=ture
-
env_file:使用文件指定环境变量,其优先级低于environment 指定的环境变量
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #env_file: /opt/module/myenv env_file: - /opt/module/myenv
-
expose:端口暴露,将端口暴露给管理器中其他容器,而不暴露给主机
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 expose: - "80" - "3000"
-
image:指定容器启动时所使用的镜像
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 image: nginx
-
network_mode:指定管理器中容器之间的网络模式
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 #network_mode: "bridge" # 桥接模式 #network_mode: "host" # 主机模式 #network_mode: "none" #network_mode: "service:[service name]" # 指定服务连接(必须是管理器的) #network_mode: "container:[container name/id]" # 指定容器名称/id进行连接(可以是外面的)
-
ports:端口映射,对外暴露端口,与expose对应
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 ports: # 端口暴露,其格式为 宿主机端口:容器暴露端口 - "80:81" - "3306:3306"
-
links:指定服务连接到当前连接,可使用别名进行连接,防止使用默认ip方式连接,要是管理器中的容器,此方法不使用了,详情查看:https://blog.csdn.net/y19910825/article/details/106937611
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 links: # 服务名称:访问别名 - docker-compose-eureka-server:eureka-server
-
volumes:文件挂载
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称\ volumes: - /opt/module/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-
container_name:指定容器名称
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 container_name: mynginx
-
restart:重启方式
version: '2' # 表示docker-compose.yml版本 services: nginx-service: # 服务名称 restart: always # 开机自启