目录
2.3 使用dockercompose 编排nginx+springboot 项目
1、 什么是Docker
- Docker是一个开源的应用容器引擎;
- 诞生于2013年初,基于Go语言实现,doCloud公司出品(改名为Docker Inc);
- Docker可以让开者打包他们的运用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。
- 容器时完全使用沙箱机制,相互隔离;
- 容器性能开销极低。
- Docker从17.03版本之后分为CE(CommunityEdition:社区版(免费))和EE(Enterprise Edition:企业版(收费))
小结:docker是一种容器技术,解决软件跨环境迁移问题
2、安装Docker
Docker可以运行在MAC,Windows,CtenOS,UBUNTU等操作系统上。官网
Docker: Accelerated, Containerized Application Development
-
CtenOS7:
#1、yum 包更新到最新
yum update
#2、安装需要的软件包,yun-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖
yum install -y yun -utils device-mapper-persistent-data lvm2
#3、 设置yum源
yum-config-manger --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
#5、 查看docker版本,验证是否验证成功
docker -v
安装完成即可看到版本就安装成功
当下载失败就继续执行
yum install -y docker-ce
-
win
下载路径:Index of win/static/stable/x86_64/
-
ubuntu
1、安装docker:sudo apt-get install -y docker.io
2、启动docker服务:systemctl start docker
3、设置开机启动:systemctl enable docker
4、查看docker状态:systemctl status docker
5、停止docker服务:systemctl stop docker
6、查看docker版本:docker version
3、Docker架构
- 镜像(image):Docker镜像,就相当于是一个root文件系统。比如官方镜像Ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
- 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义吗,容器时镜像运行时实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。
4、配置Docker镜像加速器
默认情况下,将来熊docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器。
- USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)需要到相应的配置文件中更改其配置
- 阿里云:(登陆阿里云,会生成一个自己独有的加速器地址,直接黏贴即可)
- 腾讯云: 与阿里云类似
- 网易云: 与阿里云类似
配置:
将其命令中的代码都复制过来直接执行即可;
如果使用的是中科大镜像加速镜像那么就将daemon.json 中的
替换一下即可;
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
5、Docker服务相关命令
- 启动docker服务:
# centos 7 systemctl start docker
- 停止docker服务:
#停止 centos7 systemctl stop docker
- 重启docker服务:
#重启 centos7 systemctl restart docker
- 查看docker服务状态:
#查看状态 centos7 systemctl status docker
- 开机启动docker服务:
#开机启动docker systemctl enable docker
6、Docker 镜像相关的命令
- 查看镜像:
# 查看本地镜像 docker images
- 搜索镜像:
# 搜索 decker search +名称 decker search redis
- 拉起镜像:(下载)
# 下载/拉取 docker pull redis:版本号 例如:docker pull redis:5.0 # 当不写版本号则下载的版本为最新版本 latest # 拉取镜像时需要版本号可以到 https://hub.docker.com/ 中查看 docker pull redis
- 删除镜像:
-
# 删除 docker rmi de25a81a5a0b # 也可以通过 REPOSITORY和TAG进行删除 docker rmi redis:latest docker rmi +(image ID编号) docker rmi + (软件名:版本号) #---查看所有进行id docker images -q #----删除所有镜像------ docker rmi `docker images -q`
通过docker 下载软件可以去官网查看,默认下载是最新版本
版本信息
在下载时需要软件名和版本号之间用 : 隔开
docker pull redis:5.0
official 下 [OK] 表示是官方版本
7、Docker 容器相关命令(重要)
- 查看容器:
#查看镜像 docker images #查看容器 只能查看开启的 docker ps #查看历史容器 docker ps -a
- 创建容器:
方式1 #docker run -it --name=c1 centos:7 /bin/bash #-i 表示容器一直运行,如果没有-i,那么没有容器链接那就会自动关闭容器 # -it 其中t:表示分配终端接收命令 (交互式) # --name=c1: :--name=这里是给容器取名称;名称可以随便取;--name+空格和名称/--name=名称 # centos:7 :指定基础版本,版本用":"隔开 #/bin/bash :打开窗口 # 通过-it创建的容器当退出容器后会自动关闭;通过 ps:查看不到 # 通过 exit 退出后就会关闭 docker run -it --name=c1 /bin/bash #方式2 #d 后台创建容器;通过-id创建的话rxit退出不会自动关闭 -id创建的是(守护式) #进入容器:通过-id创建的容器创建完成不会自动进入 # 通过 exit 退出后不会关闭 docker run -id --name=c2 centos:7 #进入容器 t表示接受终端命令 docker exec -it c2 /bin/bash
表示已经进入了 容器;
- 启动容器:
# c2:容器名称 docker start c2
- 停止容器:
# c2:表示容器名称 docker stop c2
- 删除容器:
#删除 rm 后跟容器id/名称 docker rm c2 #删除所有的容器 docker rm `docker pa aq` #查看所有日期的id docker ps -aq 注意:开启的容器不能删除
- 查看容器信息:
#c2:表示容器名称 docker inspect c2
- 退出容器
exit
- 进入容器:
#进入容器 t表示接受终端命令 c2是容器名称 docker exec -it c2 /bin/bash
8、Docker容器的数据卷(共享文件夹)
查看docker容器配置文件:
cd /var/lib/docker/containers/容器id/config.v2.json
8.1 思考
- Docker 容器删除后,在容器中产生的数据还在吗?
- Docker 容器和外部及其可以直接交换文件吗?
- 容器之间相互进行数据交互?
1、外部及其与容器之间是不互通的,但是外部及其与宿主机器互通
2、容器之间交换数据
8.2 数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂在多个数据卷
作用:
- 容器数据持久化
- 外部及其和容器间接通信
- 容器之间数据交换
8.2.1 配置数据卷
创建启动容器时,使用 -v 参数设置数据卷
docker run .. -v 宿主机目录(文件): 容器内目录(文件)
注意事项:
- 目录必须是绝对路劲
- 如果目录不存在,会自动创建
- 可以挂在多个数据卷
8.2.2 数据卷容器
所容器进行数据交换:
1、多个容器挂在同一个数据卷
2、数据卷容器
配置数据卷容器
1、创建启动c3 数据卷容器,使用 -v 参数设置数据卷
2、创建启动 c1 c2 容器,使用 --volumes-form 参数 设置数据卷
3、将创建完成的容器绑定到数据卷中
docker run -it -v /myDataVolume:/dataVolumerContainer centos
数据卷:
1、数据卷概念:
宿主机的一个目录或文件
2、数据卷作用
容器数据持久化
客户端和容器数据交换
容器间数据交换
3、数据卷容器
创建一个容器,挂在一个木兰路,让其他容器继承自该容器(--volume-from)
通过简单方式实现数据卷配置
9、Docker应用部署
9.1 Mysql 部署
需求
在docker容器中部署Mysql,并通过外部的Mysql客户端操作Mysql数据库
实现步骤
- 搜索Mysql镜像
- 拉起mysql镜像
- 创建容器
- 操作容器中的Mysql
注意:
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部术器访问宿主机的该端口,从而间接访问容器的服务。
- 这种操作称为:端口映射
1、搜索Mysql 镜像
docker search mysql
2、拉起Mysql镜像
docker pull mysql:5.6
3、创建容器 包含内容有mysql:5.6
在 root 目录下创建mysql目录用于存储mysql数据信息
mkdir /roo/mysql
cd /root/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/confi.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
参数说明
-p 3307:3306 :将容器 3306端口映射到宿主机的 3307端口
-v $PWD/config:/etc/mysql/conf.d:将主机当前目录下的 config/mysql.conf 挂载到容器的/etc/mysql/my.conf。配置目录
-v $PWD/logs:/logs :将主机当前目录下的logs目录挂载到容器的/logs。的日志目录
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂在到容器的:/var/lib/mysql 。数据目录
-e MYSQL_ROOT_PASSWORD=123456 :mysql 初始化root用户密码
4、查看docker容器中是否存在mysql
第一步:就去容器
docker exec -it c_mysql /bin/bash
第二步:链接mysql
mysql -uroot -p123456
第三部:测试外部链接mysql
容器和宿主机之间的端口映射是:3306-->3307
9.2 Tomcat 部署
需求:
在docker容器中部署tomcat,通过外部机器访问Tomcat部署项目。
实现步骤
1)搜索Tomcat镜像
docker images # 查看有那些镜像
docker search tomcat
2)拉取Tomcat镜像
docker pull tomcat
3)创建容器
# 在root目录下创建Tomcat目录用于存储Tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/webapps \
tomcat
参数说明:
-p 8080:8080:将日期的8080端口映射到主机的8080 端口
-v $PWD:/user/local/tomcat/webapps:将主机中当前目录挂在到容器的webapps
进入c_tomcat:
docker exec -it c_tomcat /bin/bash
4)部署项目
在 tomcat 目录下穿件一个index.html 文件在里面写入内容即可查看
5)测试访问
http://127.0.0.1:8080/index.html
9.3 Nginx 部署
需求:
在docker 容器中部署Nginx,并通过外部及其访问Nginx;
实现步骤:
1)搜索Nginx镜像
docker images
docker search naginx
2)拉取Nginx镜像
docker pull nginx
3)创建容器
# 在/root 目录下创建Nginx目录用于存储Nginx数据
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
#在~/nginx/conf/下创建ngingx.conf文件,粘贴下面内容
vim nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
# 在上述的 nginx目录中使用
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
参数说明:
-p 81:80:将容器的80 单口映射到主机的81端口
-v $PWD/conf/nginx.conf/etc/nginx/nginx.conf:将主机当前目录下的/conf/nginx.conf挂在到容器的:/etc/ngingx/nginx.conf。配置目录
-v $PWD/logs:/var/log/nginx:将主机当前目录下的logs目录挂在到容器的/var/log/nginx。日志目录
4)测试访问
在nginx目录下的html目录下创建index.html文件
9.4 Redis 部署
需求:
在docker容器中部署Redis,并通过外部及其访问Redis
实现步骤:
1)搜索redis镜像
docker search redis
2)拉取redis镜像
docker pull redis:5.0
3)创建容器
docker run -id --name=c_redis -p 6380:6379 redis:5.0
参数说明:
6380:6379:将容器内6379映射到外部机器的6380
4)访问容器
./redis-cli.exe -h 192.168.149.135 -p 6380
10、DockerFile
docker 镜像原理
docker镜像本质是什么?
docker操作系统的ISO镜像为什么只有200MB,而一个centos操作系统ios 文件需要几个G?
docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70MB?
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 网络通信子系统
- 网络通信子系统
- 作业控制子系统
linux 文件系统由bootfs 和rootfs两部分组成
bootfs:包含bootloaber(引导加载程序)和kernel(内核)
rootfs:root 文件系统,包含的就是典型Linux系统中的/div,/proc,/bin,/etc等表中目录和文件
不同的linux发行版,bootfs基本一样,二rootfs不同,如ubuntu,contos等
docker镜像是由特殊的文件系统叠加而成
最底端是bootfs,并使用宿主机的bootfs
第二层是root文件系统rootfs,称为base image
然后再往上可以叠加其他的镜像文件
统—文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
docker镜像的本质是什么?
是一个分层的文件系统
docker操作系统的ISO镜像为什么只有200MB,而一个centos操作系统ios 文件需要几个G?
Contos的ISO文件包含bootfs和rootfs,而docker的contos 镜像复用操作系统boofts,只有rootfs和其他镜像层
docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70MB?
由于docker中镜像是分层的,tomcat虽然只有70MB,但他需要依赖于父镜像和基础镜像,所有整体个对外暴露的tomcat镜像大小500多MB
制作镜像(重点)
docker如何制作?
1、容器转为镜像
docker commit 容器id 镜像名称:版本号
root@yjc-virtual-machine:/home/docker_list# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b56872446588 redis "docker-entrypoint.s…" 34 minutes ago Up 34 minutes 0.0.0.0:6380->6379/tcp, :::6380->6379/tcp c_redis
0c04be8c5826 nginx "/docker-entrypoint.…" 47 minutes ago Up 47 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp c_nginx
440e7a321273 tomcat "catalina.sh run" 3 hours ago Up 3 hours 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp c_tomcat1
4c46777a1b78 tomcat "catalina.sh run" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp c_tomcat
3a05eac51d11 mysql:latest "docker-entrypoint.s…" 4 hours ago Up 4 hours 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp c_mysql
783549c44e76 ubuntu:latest "/bin/bash" 8 weeks ago Exited (255) 5 weeks ago ubuntu04
7927feb341e4 ubuntu:latest "bash" 8 weeks ago Exited (255) 5 weeks ago ubuntu02
33b57fbc8f31 ubuntu:latest "bash" 8 weeks ago Exited (0) 7 weeks ago ubuntu01
root@yjc-virtual-machine:/home/docker_list# docker commit b56872446588 xidida_redis:1.0
sha256:180250b577c60a791aa31e25d9a6115eb4602954d9971385190d116bf64ed2ec
root@yjc-virtual-machine:/home/docker_list# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xidida_redis 1.0 180250b577c6 2 minutes ago 113MB
nginx latest 605c77e624dd 17 months ago 141MB
tomcat latest fb5657adc892 17 months ago 680MB
openjdk 8 e24ac15e052e 17 months ago 526MB
redis latest 7614ae9453d1 17 months ago 113MB
mysql latest 3218b38490ce 17 months ago 516MB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
root@yjc-virtual-machine:/home/docker_list#
docker save -o 压缩文件名称 镜像名称:版本号
root@yjc-virtual-machine:/home/docker_list# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xidida_redis 1.0 180250b577c6 7 minutes ago 113MB
nginx latest 605c77e624dd 17 months ago 141MB
tomcat latest fb5657adc892 17 months ago 680MB
openjdk 8 e24ac15e052e 17 months ago 526MB
redis latest 7614ae9453d1 17 months ago 113MB
mysql latest 3218b38490ce 17 months ago 516MB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
root@yjc-virtual-machine:/home/docker_list# docker save -o redis.tar xidida_redis:1.0
root@yjc-virtual-machine:/home/docker_list# ll
总用量 113620
drwxr-xr-x 10 root root 4096 6月 5 18:00 ./
drwxr-xr-x 5 root root 4096 6月 5 13:24 ../
drwxr-xr-x 2 root root 4096 6月 5 13:26 conf/
drwxr-xr-x 7 999 root 4096 6月 5 13:29 data/
drwxr-xr-x 2 root root 4096 6月 5 13:26 logs/
drwxr-xr-x 2 root root 4096 6月 5 13:25 mysql/
drwxr-xr-x 2 root root 4096 6月 5 16:58 nginx/
drwxr-xr-x 2 root root 4096 6月 5 17:13 redis/
-rw------- 1 root root 116303872 6月 5 18:00 redis.tar
drwxr-xr-x 3 root root 4096 6月 5 14:43 tomcat/
drwxr-xr-x 2 root root 4096 6月 5 14:17 webapps/
docker load -i 压缩文件名称
root@yjc-virtual-machine:/home/docker_list# docker rmi 180250b577c6 # 删除原来的镜像
Untagged: xidida_redis:1.0
Deleted: sha256:180250b577c60a791aa31e25d9a6115eb4602954d9971385190d116bf64ed2ec
root@yjc-virtual-machine:/home/docker_list# docker images # 查看镜像列表
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 17 months ago 141MB
tomcat latest fb5657adc892 17 months ago 680MB
openjdk 8 e24ac15e052e 17 months ago 526MB
redis latest 7614ae9453d1 17 months ago 113MB
mysql latest 3218b38490ce 17 months ago 516MB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
root@yjc-virtual-machine:/home/docker_list# docker load -i redis.tar # 恢复镜像
Loaded image: xidida_redis:1.0
root@yjc-virtual-machine:/home/docker_list# docker images # 恢复后的镜像列表
REPOSITORY TAG IMAGE ID CREATED SIZE
xidida_redis 1.0 180250b577c6 41 hours ago 113MB
nginx latest 605c77e624dd 17 months ago 141MB
tomcat latest fb5657adc892 17 months ago 680MB
openjdk 8 e24ac15e052e 17 months ago 526MB
redis latest 7614ae9453d1 17 months ago 113MB
mysql latest 3218b38490ce 17 months ago 516MB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
# 运行容器
root@yjc-virtual-machine:/home/docker_list# docker run -it --name=new_redis xidida_redis:1.0 bash
root@c79bc99c2001:/data#
2、dockerfile
Dockerfile概念
- dockerfile是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一直的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
Docker网址:https://hub.docker.com/
FROM java:8
MAINTAINER xidida <xidida@xidida.com>
ADD demo_springbook_docker.jar app.jar
CMD java -jar app.jar
关键字 | 作用 | 备注 |
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile 谁写的 |
LABEL | 标签 | 用来标明dockerfile 的标签可以使用label代替Maintainer最终都是在docker image基本信息中可以查看 |
RUN | 执行命令容器启动执行 | 执行一段命令默认是/bin/sh格式:RUNcommd 或者RUN['command',"param1",“param2”] |
CMD | 容器启动口令 | 提供启动容器时候的默认命令和ENTRYPONT配合使用,格式CMD command param1 param2 或者 CMD ["command","param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build 的时候添加文件到image中不仅仅局限于当前build 上下文可以来源于远程服务 |
ENV | 环境变量 | 指定build时环境变量可以在启动的容器的时候通过-e覆盖格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂在的数据卷 | 指定build 的image那些目录可以启动的时候挂载到文件系统中容器的时候使用-v绑定格式VOLUME["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口启动容器的使用-p来绑定暴露的端口 格式 EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/使用的是绝对地址 如果不是/开头那么是在上一条workdir的路劲的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户在RUN CMD ENTRYPONT 执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定检测当前容器的健康检测的命令 基本上没用 因为很多时候 应用本身有健康检测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM 完成之后 会执行ONBUILD 的命令但是不影响当前镜像 用处不怎么打 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN COMENTRYPOINT 执行命令的时候使用的shell |
3、定义dockerfile 发布springboot项目
将springboot项目打包
找到jar包
实现步骤:
下载java:8
docker search java
docker pull java:8
1、定义父镜像:FROM java8
2、定义作者:MAINTAINER itheima<itheima@itcast.cn>
3、将jar包添加到容器:ADD springboot.jar app.jar
4、定义容器启动执行的命令:CMD java -jar app.jar
FROM java:8
MAINTAINER xidida <xidida@xidida.com>
ADD demo_springbook_docker.jar app.jar
CMD java -jar app.jar
5、通过dockerfile构造镜像:docker bulid -f dockerfile 文件镜像名称:版本
docker build -f dockerfile文件名 -t 命名为:版本号 .
docker build -f ./demo_springbook_dockerfile -t app .
# 它会使用当前目录下的demo_springbook_dockerfile文件来构建一个名为app的Docker镜像。
# -f ./demo_springbook_dockerfile表示指定要使用的Dockerfile文件名为当前目录下的demo_springbook_dockerfile
# -t app表示为构建的镜像指定一个名称(app)
# .表示从当前目录开始构建。
构建完成
启动 应用
docker run -id 镜像名称/镜像ID
docker run -id app
docker run -id -p 本机端口:容器端口 46a1f6f4f5be
docker run -id -p 8084:8080 46a1f6f4f5be
启动成功,访问
java接口
3、自定义ubuntu镜像
需求:
自定义ubuntu镜像。要求
1、默认登陆路径为/usr
2、可以使用vim
root@yjc-virtual-machine:/home/yjc# docker run -it --name=c4 ubuntu
实现步骤:
1、定义父镜像:FROM ubuntu:版本号
2、定义作者信息: maintainer xidida<xidida@2654152420@qq.com>
3、执行安装vim命令:RUN apt update, apt install -y vim
4、定义容器启动执行的命令:CMD /bin/bash
docker build -f ./docker_file -t xidida_ubuntu:1 .
工具镜像创建容器:
# 创建容器
docker run -it --name=xidida_ubuntu_c1 xidida_ubuntu:1
11、Docker 服务编排
1、服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
- 要从Dockerfile build image或者去dockerhub拉取image
- 要创建多个container
- 要管理这些container (启动停止删除)
服务编排:按照一定的业务规则批量管理容器
2、Docker Compose概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 利用Dockerfile定义运行环境镜像
- 使用docker-compose.yml定义组成应用的各服务
- 运行docker-composeup启动应用
2.1 安装 Docker Compose
Releases · docker/compose · GitHub
# sudo apt install curl
# Compose 目前已经完全支持 Linux,Max OS和Windows,在外面安装Compose之前,需要先安装Docker。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose -version
2.2 卸载docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/docker-co,pose
2.3 使用dockercompose 编排nginx+springboot 项目
1、创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
2、编写docker-compose.yml 文件
version: '3' # 版本
services:
naginx:
image: nginx
ports: # 端口映射
- 80:80
links:
- app
volumes: #挂在目录
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
3、创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
4、在./nginx/conf.d目录下编写 xidida.conf 文件
server {
listen 80;
access_log off;
location /{
proxy_pass http://app:8080;
}
}
12、Docker 私有仓库
1、搭建私有仓库
Docker官方的Dockerhub (https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
# 1、拉取私有仓库镜像
docker pull registry
#2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 如数地址 http:// 私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]}表示私有仓库 搭建成功
# 4、修改 daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key ,保存退出。此步用于让 docker 信任私有仓库地址;注意私有服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
#5、重启 docker 服务器
systemctl restart docker
docker start registry
http://192.168.183.138:5000/v2/_catalog
2、上传镜像到私有仓库
# 1、 标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
在打完标记后删除最好按照名字删除,如果使用id 删除则会两个都删除
上传完成可以查看:
3、从私有仓库拉取镜像
# 1、拉取镜像
docker pull 镜像名称
13、Docker 相关概念
docker容器虚拟化与传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同:
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统