docker 学习

0.docker三要素

镜像 类似于java中的类 是一类的抽象模板

容器 类似于java中的对象 是类实例化出来的一个具体的实例

仓库 用于存储镜像的一个地方 任何人都可以进行推送拉取 。自己可以搭建私有库和公有库

1.docker 安装

参考 这篇文章 Linux centos7发行版的 docker 和docker-compose 安装

2.docker常用命令

1.centos7 docker 命令

查看docker状态

systemctl status docker

启动docker服务

systemctl start docker

停止docker服务

systemctl stopdocker

重启docker服务

systemctl restart docker

查看docker版本

docker -v

docker version

查看docker信息

docker info

docker 帮助命令

docker --help

2.镜像命令

列出当前服务器上可用docker镜像

docker images

列出当前服务器上所有docker镜像

docker images -a 

列出当前服务器上所有docker镜像id

docker images -aq

列出当前服务器上可用docker镜像

docker images -q

查询docker镜像

docker search [OPTIONS] 镜像名字 
eg:

docker search redis

下载镜像 没有tag 默认是latest(最新的)

docker pull 镜像名字[:TAG] eg:

docker pull mysql:5.7

删除单个镜像  -f 强制删除

docker rmi 某个XXX镜像名字/ID eg:

docker rmi mysql:5.7

删除多个镜像

1.

docker rmi mysql:5.7 redis

2.

docker rmi -f $(docker images -qa) / docker images -aq | xargs docker rmi -f

3.容器命令

列出当前正在运行的容器

docker ps

列出当前所有的容器

docker ps -a 

从镜像中启动一个容器(实例化)

docker run [options] 容器名称/容器id [command] [args]

[options] 可填写内容

--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
      ip:hostPort:containerPort
      ip::containerPort
      hostPort:containerPort
      containerPort

eg:

docker run --name myRedis -p 6379:6379 -d redis redis-server /etc/config/redis.conf

交互方式启动并进入容器

docker run --name myRedis -p 6379:6379 -it redis /bin/bash

退出交互模式 1.exit (容器停止退出) 2.ctrl+P+Q(容器不停止退出)

容器启动后重新以交互模式进入

exit 退出不关闭容器 推荐

docker exec -it redis /bin/bash 

exit退出关闭容器 不推荐线上使用

docker attach redis 

启动容器

docker start 容器id/容器名称

停止容器

docker stop 容器id/容器名称

重启容器

docker restart 容器id/容器名称

强制停止容器

docker kill 容器id/容器名称

删除已停止容器

docker rm 容器id/容器名称

删除未停止容器

docker rm -f 容器id/容器名称

一次删除多个容器

docker rm -f $(docker ps -a -q) / docker ps -a -q | xargs docker rm

查看容器日志

docker logs -f -t  容器id/名称

  -t 是加入时间戳

  -f 跟随最新的日志打印

  --tail 数字 显示最后多少条

查看容器内运行的进程

docker top 容器id/名称

查看容器内细节

docker top 容器id/名称

docker top 容器id/名称

从容器内复制文件到主机

docker cp 容器id:容器中路径  主机中路径

eg:

docker cp myRedis:/redis/config  /docker/redis/config

docker cp  主机中路径 容器id:容器中路径 

eg:

docker cp  /docker/redis/config myRedis:/redis/config 

4.其他命令

更新原来的镜像提交成新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

eg:

docker commit -m='test 测试' -a='wyc 五月' 5d503ada38a0  my/test:v5

导入镜像

docker import 源tar包路径 组织:版本

docker import /home/jd/aaa.tar my/aaa:v1

导出镜像

docker export 5d503ada38a0 > /home/jd/aaa.tar
docker export 1e560fca3906 > ubuntu.tar

设置镜像标签 (给该镜像重新命名一个标签 如果要删除需要强制删除才行)

docker tag 860c279d2fec runoob/centos:dev

使用Dockerfile文件构建镜像(dockerfile 文件和要打的jar包文件最好在一起 省事)

docker build -t my/test .

-t :指定要创建的目标镜像名

. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

登录远程库

提交镜像到远程库

3.docker数据卷

是什么

docker容器数据卷类似于redis中的aof rdb的持久化策略,可以将容器和主机中的数据进行共享关联,即使容器删除之后,只要主机中的备份数据在,只要重新启动容器,挂载相同的容器数据卷目录,数据即可恢复。

能干什么

1.数据持久化

2.容器间继承数据卷+共享数据

挂载数据卷

1.直接在run命令后面添加

eg:

docker run -p 3306:3306 --name mysqllatest --privileged=true \
-v /docker/mysql/log:/var/log/mysql:rw \
-v /docker/mysql/data:/var/lib/mysql:rw \
-v /docker/mysql/conf/:/etc/mysql/conf.d:rw \
-e MYSQL_ROOT_PASSWORD=root@MYSQL -e TZ=Asia/Shanghai \
-d 019814493c7a 

--privileged=true 加上这个 防止出现文件权限不足

:rw 可以控制文件夹的权限

使用-v 进行数据卷的挂载 -v 主机目录:容器目录

2.在Dockerfile中使用

格式 VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

eg:

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

这种方式对应的主机目录使用 docker inspect 镜像id/名称 查看Volumes属性

数据卷容器

父容器挂载数据卷,其他容器通过挂载这个(父容器)进行数据共享,挂载数据卷的容器称为数据卷容器(父容器)。

容器间传递共享(--volumes-from)

如何使用

1.父容器通过-v挂载目录

docker run -it --name test3 -v /home/jd/testvolumes:/volumes 5d0da3dc9764 bash

2.其他容器通过--volumes-from 父容器名称/id 进行容器间的数据共享

eg:

docker run -it --name test4 --volumes-from test3 5d0da3dc9764 bash

结论:容器之间数据信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

4.Dockerfile解析

是什么

1.Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

Dockerfile 这玩意就是构建镜像的原材料,镜像相当于一个构建好的产品模板,容器则是该产品模板的具体实现,仓库则是存放模板的地方。当然我们也可以在模板上进行再修改,提交成为新的模板。

2.构建三步骤

编写Dcokerfile文件 -> docker build -> docker run 

解析构建过程

1.Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

2.Docker执行Dockerfile的大致流程

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile体系结构(保留字指令)

参考菜鸟解释 Docker Dockerfile | 菜鸟教程

FROM:基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令

EXPOSE:当前容器对外暴露出的端口

WORKDIR:指定在创建容器后,终端默认登陆的进来的工作目录,一个落脚点

ENV:用来在构建镜像过程中设置环境变量

ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

ENTRYPOINT :指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数.可以认为这个是静态的参数,cmd是动态可替换的参数

ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。如果一个Dockerfile中的from 命令后面跟着另一个基础镜像 如果基础镜像的dockerfile中有这个命令则会在子进行docker build的时候出发命令

实际案例

将一个springboot项目jar包 使用docker部署

FROM anapsix/alpine-java:8_server-jre_unlimited

MAINTAINER wyc

RUN mkdir -p /my/docker

WORKDIR /my/docker

ENV SERVER_PORT=9000

EXPOSE ${SERVER_PORT}

ADD ./target/test_spring-0.0.1-SNAPSHOT.jar ./test-spring.jar

CMD  java -Xmx128m -Xms128m -jar test-spring.jar

5.docker网络

TODO

狮子大佬的博客 docker 网络

常用命令

默认创建三个网络

NETWORK ID     NAME      DRIVER    SCOPE
3559cafa542e   bridge    bridge    local
07a9266599e8   host      host      local
2f4478eb95fd   none      null      local

列出所有的网络

docker network ls 

获取网络连接命令

docker network --help

创建网络aa

docker network create aa 

删除网络aa 

docker network rm aa 

修改容器网络为bridge 

docker network connect bridge 99052c3152b1

断开容器的bridge 网络

docker network disconnect bridge 99052c3152b1

修改网络为host主机模式 只能删除容器重启run一个容器

docker run  --name xxljobadmin -d --network host f3cec842c5f0

6.搭建本地仓库和推送远程阿里云仓库

阿里云仓库个人版

1.开通阿里云容器镜像服务

2.创建镜像空间

3.创建仓库

4.本地推送命令

1. 登录阿里云Docker Registry

docker login --username=123456 registry.cn-hangzhou.aliyuncs.com


用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/wyc-test/wyc:[镜像版本号]


3. 将镜像推送到Registry

docker login --username=123456  registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/wyc-test/wyc:[镜像版本号]

docker push registry.cn-hangzhou.aliyuncs.com/wyc-test/wyc:[镜像版本号]


请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

docker images


REPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB

docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816


使用 "docker push" 命令将该镜像推送至远程。

docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

7.常用软件的安装(单机版)

参考这个链接常用软件的安装

8.常用软件的安装(集群版)

9.容器编排 docker-compose

参考文档

1. 官网 docker-compose 语法参考

2.其他大佬的笔记 博客园链接

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值