Docker

目录

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

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

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

相同:

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

不同:

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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值