目录

1、 什么是Docker

2、安装Docker

CtenOS7:

win

ubuntu

3、Docker架构

4、配置Docker镜像加速器

5、Docker服务相关命令

6、Docker 镜像相关的命令

7、Docker 容器相关命令(重要)

8、Docker容器的数据卷(共享文件夹)

8.1 思考

8.2 数据卷

8.2.1 配置数据卷

 8.2.2 数据卷容器

9、Docker应用部署

9.1 Mysql 部署

需求

实现步骤

注意:

1、搜索Mysql 镜像

2、拉起Mysql镜像

3、创建容器 包含内容有mysql:5.6

4、查看docker容器中是否存在mysql

9.2 Tomcat 部署

需求:

实现步骤

9.3 Nginx 部署

需求:

实现步骤:

9.4 Redis 部署

需求:

实现步骤:

10、DockerFile

docker 镜像原理

操作系统组成部分:

制作镜像(重点)

1、容器转为镜像

2、dockerfile

3、定义dockerfile 发布springboot项目

3、自定义ubuntu镜像

11、Docker 服务编排

1、服务编排概念

2、Docker Compose概述

2.1 安装 Docker Compose

2.2  卸载docker Compose

2.3 使用dockercompose 编排nginx+springboot 项目

12、Docker 私有仓库

1、搭建私有仓库

​编辑

2、上传镜像到私有仓库

3、从私有仓库拉取镜像

13、Docker 相关概念

docker容器虚拟化与传统虚拟机比较


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 Hub

版本信息

在下载时需要软件名和版本号之间用 : 隔开

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容器虚拟化与传统虚拟机比较

容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势

不同:

  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
  • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统

 

 

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐