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
containerPorteg:
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. 将镜像推送到Registrydocker 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 MBdocker 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
参考文档
2.其他大佬的笔记 博客园链接