Docker使用

一、Docker架构图

image.png

1.1 仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
1.2 镜像
Docker 镜像是用于创建 Docker 容器的模板,类似于Java中类的概念。
1.3 容器
是独立运行的一个或一组应用。通过镜像创建生成,类似于Java中的对象概念。

二、Docker安装

在CentOS上安装Docker(CentOS版本必须7+)

2.1 安装前置环境
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 设置docker-ce版安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast
2.3 安装docker
yum -y install docker-ce
2.4 启动/停止docker
systemctl start/stop docker
2.5 基于阿里云配置镜像加速

登录网址: https://dev.aliyun.com/

image.png

按照官方的操作文档修改配置文件即可 <br />注意:如果/etc/docker/daemon.json文件不存在,创建一个即可


image.png

拿到加速地址后:
step1:进入docker目录下
step2:新建一个文件daemon.json
step3:复制加速地址


image.png

step4:保存后执行下面两个命令
sudo systemctl daemon-reload
sudo systemctl restart docker
image.png

2.6 重启docker服务

systemctl restart docker

2.7 测试docker服务

docker run hello-world
image.png

三、Docker的基本命令

3.1 镜像相关的命令

3.1.1 搜索镜像

docker search [镜像名称]

参数介绍:

-f, --filter 根据提供的条件过滤器输出
--format 用Go模板打印出漂亮的搜索结果
--limit [n] 搜索结果的最大数量(默认值为25)
--no-trunc 不要截断输出

3.1.2 拉取镜像(从仓库中下载镜像到本地)

docker pull [镜像名称][:标签]
例子:docker pull tomcat:8

https://hub.docker.com/找docker镜像资料和版本号
注意:

拉取镜像时如果没有显示的指定tag标签,默认会拉取latest标签的版本镜像

image.png

3.1.3 查看本地镜像

docker images

参数介绍:

-q 只显示镜像唯一的标识信息

3.1.4 删除镜像

docker rmi [镜像名称:tag]/[镜像ID]
例子:
docker rmi tomcat:8
docker rmi f19c56ce92a8
image.png

参数介绍:

-f 强制删除镜像

3.1.5查看容器详细信息

docker inspect 容器名
例子:docker inspect mysql

3.2 容器相关的命令

3.2.1 根据镜像运行容器

docker run [镜像名称][:tag]

参数介绍:
-i 保持和 docker 容器内的交互
-t 为容器的标准输入,虚拟一个tty
-d 后台运行容器
--rm 容器在启动后,执行完成命令或程序后就销毁(不可于 -d 一起使用)
--name 给容器起一个自定义名称
--restart docker 1.12 新增加的参数,用来指定容器的重启策略, 当前提供的策略包括:
no 默认值,如果容器挂掉不自动重启。
on-failure,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数
always,只要容器退出,则docker将自动重启容器
例子:docker run -d --name mytomcat -p 9999:8080 --restart=always tomcat:8
-p 将宿主机中的某个端口映射到容器中的某个端口上
8888:宿主机端口 8080:容器端口

image.png

说明:由于浏览器访问不了tomcat容器里的端口,所以需要宿主机的端口映射到容器中的端口上

3.2.2 查看容器

docker ps

参数介绍:
-a 查看所有容器(默认不查询停止的容器)docker ps -a
-q 只查询容器的id

3.2.3 容器启动/停止/重启

docker start/stop/restart 容器名称

如果重启出现以下错误


image.png

step1:启动一下docker
systemctl restart docker
重启后,mytomcat并没有启动


image.png

step2:启动mytomcat
docker start mytomcat
image.png

【测试】访问


image.png

如果浏览器访问不了tomcat,则修改文件
把webapps.dist里面的文件全部复制到webapps里面
image.png

退出后重启tomcat:docker restart mytomcat
image.png

3.2.4 查看容器的元数据

docker inspect 容器名称

3.2.5 删除容器

docker rm 容器名称

参数介绍:
-f 表示强制删除一个容器(默认不能删除一个运行中的容器)

3.2.6 进入容器中

    docker exec [option] 容器名称 [args]
    例子:docker exec -it mytomcat bash
    退出容器:exit

参数介绍:
-i 保持和 docker 容器内的交互
-t 为容器的标准输入,虚拟一个tty
-w 指定进入容器后的工作路径
args:表示进入容器后执行的命令,如果需要和容器进行交互式访问,需要配置参数为-it,并且命令设置为bash(表示通过命令行的方式交互访问容器)
注意:
该命令只能进入到运行中的容器

3.2.7 查看容器运行日志

    docker logs 容器名称

参数介绍:
--tail n 选项可以指定查看最后n条日志
-t 选项则可以对日志条目附加时间戳。
--until 显示在某个时间戳(例如:2018-05-25T 13:23:37)之前的日志,还可以相对时间(例如:42m 42 minutes)
-f 实时打印日志内容

3.2.7 宿主机和容器间的数据拷贝

    docker cp [OPTIONS] 容器名称:容器内路径 宿主机路径 
    docker cp [OPTIONS] 宿主机路径 容器名称:容器内路径

例子:
docker cp test.txt mytomcat:/usr/local/tomcat
docker cp mytomcat:/usr/local/tomcat/webapp ./

注意:
1、复制文件夹不需要添加任何参数(和Linux的命令有区别)
2、无论从哪里复制,命令都是在宿主机执行

3.2.8、查看容器日志

docker logs -f elasticsearch

四、容器数据卷

4.1 什么是容器数据卷?

数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的
数据卷可以目录也可以是文件
容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换

image.png

4.2 容器数据卷的特点

1、容器启动时初始化数据卷,如果容器使用的镜像包含了数据,这些数据也会拷贝到数据卷中
2、对 数据卷 的修改会立马生效
3、数据卷的变化不会影响镜像的更新
4、数据卷是宿主机中的一个目录

4.3 数据卷的运用场景

1、在多个运行容器之间共享数据。如果您没有明确创建它,则会在第一次将其装入容器时创建卷。当该容器停止或被移除时,该卷仍然存在。多个容器可以同时安装相同的卷,无论是读写还是只读。仅当您明确删除卷时才会删除卷
2、当您想要将容器的数据存储在远程主机或云提供商上而不是本地时
3、当您需要备份,还原或将数据从一台Docker主机迁移到另一台时,卷是更好的选择。您可以停止容器,然后备份卷的目录

4.4 数据卷的相关命令

4.4.1 创建容器数据卷

docker volume create 数据卷名称
例子:docker volume create myvolume
image.png

注意
容器卷默认保存在宿主机的/var/lib/docker/volumes路径下

4.4.2 创建容器时指定数据卷

    docker run -it 
        --mount source=数据卷名称,target=容器中的挂载路径,type=volume 
        --name 容器别名 镜像名称

参数介绍:
source 指定宿主机中数据卷的名称
target 指定容器中对应的挂载路径
type 指定为数据卷的方式挂载,还可以选择bind、tmpfs,默认为volume

注意:
1、如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
2、如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉

4.4.3 直接在创建容器时指定数据卷

    docker run  ... [-v 宿主机数据卷:docker容器路径:ro] []...

注意:
1、通过这种方式可以任意指定宿主机的数据卷位置
2、如果随意指定数据卷的位置,容器中对应路径的文件就不会复制到宿主机的数据卷中,而是全部被清空
3、:ro表示以只读的方式挂载容器卷,不写再表示以读写的方式挂载
4、可以通过-v连续设置多个容器卷路径

总结:
数据卷未显示声明路径(默认在/var/lib/docker/volumes下)
1、数据卷为空,对应的容器路径有数据,则容器中的数据直接同步到数据卷中
2、数据卷有数据,对应的容器路径不存在,则启动容器时,自动创建该容器路径,并且将数据卷的数据同步到该路径下
3、数据卷有数据,对应的容器路径也有数据(数据不同),会把数据卷中的数据同步到容器路径中,容器路径中的文件会被隐藏(宿主机 覆盖 容器)

例子:
docker run -d --name mytomcat2 -p 9999:8080 -v myvolume:/usr/local/tomcat/webapps.dist tomcat:8
(会把myvolume的数据同步到webapps.dist中,而webapps.dist本来的文件会被隐藏)

如果宿主机的数据卷为空,容器覆盖宿主机,如果数据卷不为空,则宿主机覆盖容器

数据卷声明指定路径

    例子:docker run -d --name mytomcat2 -p 9999:8080 -v /usr/local/abc:/usr/local/tomcat/webapps.dist tomcat:8

1、数据卷为空,对应的容器路径有数据,则直接将容器路径中的数据隐藏
2、数据卷有数据,对应的容器路径不存在,则启动容器时,自动创建该容器路径,并且将数据卷的数据同步到该路径下
3、数据卷有数据,对应的容器路径也有数据(数据不同),会把数据卷中的数据同步到容器路径中,容器路径中的文件会被隐藏(宿主机 覆盖 容器)

无论情况如何,永远是宿主机 覆盖 容器路径
数据卷是文件的情况
注意:在执行docker run..命令前,myconfig文件夹必须存在,如果不存在,则会把application.yml文件里面的内容复制到myconfig中,此时myconfig是一个文件,不是文件夹


image.png
例子:
docker run -d --name mytomcat2 -v /usr/local/myvolume/application.yml:/usr/local/tomcat/webapps/application.yml tomcat:8

1、数据卷指定一个文件,对应的容器文件不存在,直接将数据卷文件覆盖到容器中
2、数据卷指定的文件不存在,容器的文件存在,启动容器会报错
如果需要绑定文件,则必须保证宿主机的数据卷中文件必须存在
注意:在数据卷修改文件后,需要重启容器 docker restart mytomcat2

五、Docker的应用

5.1 使用docker安装MySQL

5.1.1 拉取mysql的镜像

docker pull mysql:5.7

5.1.2 根据镜像创建容器

    docker run -d 
        -v ~/mysql/conf:/etc/mysql/conf.d //2
        -v ~/mysql/logs:/logs //3
        -v ~/mysql/data:/var/lib/mysql //4
        -p 3306:3306 //5
        -e MYSQL_ROOT_PASSWORD='root' //6
        --name mysql
        mysql:5.7

代码解释
第二行:挂载mysql配置文件到宿主机
第三行:挂载mysql日志文件到宿主机
第四行:挂载mysql的数据路径到宿主机
第五行:将容器中3306端口映射到宿主机的3306端口上
第六方:设置MySQL的root账号密码为root

5.1.3、例子:
step1:在安装mysql前需要在/usr/local/目录下先新建一个文件夹mysql_docker
mkdir mysql_docker
step2:安装MySQL
docker run -d -v /usr/local/mysql_docker/conf:/etc/mysql/conf.d -v /usr/local/mysql_docker/logs:/logs -v /usr/local/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='root' --name mysql -p 3306:3306 mysql:5.7
step3:测试是否连接上

image.png

step4:修改数据库编码格式
在docker安装的mysql的默认编码是latinl( 拉丁文),如果插入数据会乱码,需要修改编码格式
image.png

在conf文件夹下新建my.conf文件

[mysqld]
character-set-server=utf8

image.png

step5:重启mysql容器 :docker restart mysql
image.png

5.2 使用docker安装tomcat

5.2.1 拉取tomcat的镜像

    docker pull tomcat:8

5.2.2 运行tomcat容器

    docker run -d 
        --name tomcat 
        -p 8080:8080 
        -v ~/tomcat/webapps:/usr/local/tomcat/webapps  
        tomcat:8

5.2.3 进入容器中进行相关拷贝

    docker exec -it tomcat bash
    cp -r webapps.dist/* webapps

注意:
docker镜像tomcat8之后容器中webapps中没有任何内容,需要将欢迎页导入

5.2.4 将自定义工程部署到tomcat中

1、使用maven命令或者工具将自定义工程打包
2、到工程的target目录下找到打的war包
3、将war包拷贝到宿主机的tomcat数据卷中
4、重启tomcat容器 docker restart tomcat

六、Docker镜像的制作与管理

6.1 什么是Dockerfile?

Docker简单来说就是docker镜像的描述文件,最基础原始的镜像文件都是通过dockerfile文件构建而来

6.2 Dockerfile模板指令介绍

FROM:指定基础镜像,必备的指令,并且必须是第一条指令。
MAINTAINER:指明该镜像的维护者和点子邮件。

比如:MAINTAINER xxxx "xxxxx@qq.com"

ENV:设置环境变量。

比如:EVN key1=value1 key2=value2...

RUN:在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行。

    比如:RUN yum install -y mysql-server

COPY:将主机的文件复制到镜像文件中,如果目标位置不存在会自动创建。

    比如:COPY application.yml /etc/resources

ADD:和COPY一样,但是ADD会加上解压操作
EXPOSE:暴露镜像的端口供主机做映射,可以暴露多个端口。

    比如:EXPOSE 8080

WORKDIR:在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录,而且在进入容器时,会默认定位到该路径下。

    比如:WORKDIR /usr/local

VOLUME:用来向基础镜像中添加数据卷

    比如 VOLUME /root/mydata /root/condata

CMD:容器启动时需要执行的命令。

    比如 CMD /bin/bash
image.png

6.3 案例:使用Dockerfile构建自定义工程的运行镜像

6.3.1 准备好Dockerfile文件以及需要部署的工程war包

image.png

6.3.2 Dockerfile文件内容

    FROM tomcat:8 
    WORKDIR /usr/local/tomcat
    COPY test.war ./webapps
    EXPOSE 8080 
    RUN ./bin/startup.sh 

解释:
第一行:该镜像时基于tomcat:8镜像构建
第二行:设置当前基础路径,也是后续命令的相对路径
第三行:将工程war包复制到tomcat的webapps路径下
第四方:对外暴露8080端口,也就是tomcat访问路径
第五行:设置容器启动时命令,即启动tomcat

6.3.3 通过Dockerfile构建镜像

执行命令

    docker build -f ./Dockerfile -t mytest:v1 .

解释:
-f 用来指定Dockerfile模板文件
-t 用来指定自定义镜像的名称以及tag
最后的.表示当前路径

6.4 将自定义镜像推送至镜像中心(私服、阿里云等,这里以阿里云举例)

登录阿里云,并且选择容器镜像服务
创建容器仓库
登录阿里云的仓库并且通过命令推送镜像到阿里云

    docker login --username=账号 registry.cn-hangzhou.aliyuncs.com
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[镜像版本号]
    docker push registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[镜像版本号]

6.5、打war包案例:

step1:新建一个springboot项目,并打war包


image.png

step2:制作镜像

    FROM tomcat:8
    WORKDIR /usr/local/tomcat
    COPY duckerdemo.war ./webapps
    EXPOSE 8080 
    CMD ["catalina.sh","run"]
image.png

step3:生成容器

    docker build -f ./DockerFile -t myapp:v1 .
image.png

注意war包名一定要一致,否则创建镜像失败


image.png

step4:生成容器并测试


image.png

6.6、打jar包案例:

step1:工程打包
注意:如果是打jar包,必须有下面的插件,不然编译没问题,运行有问题


image.png

step2:新建文件夹并把jar包拉取到文件夹下


image.png

step3:制作镜像
    vim DockerFile
    FROM openjdk:8
    WORKDIR /usr/local
    COPY duckerdem.jar ./
    EXPOSE 8080 
    CMD ["java"."-jar","duckerdem.jar"]

step4:与war包步骤相同

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342