Docker学习笔记

docker官网:https://www.docker.com/
docker仓库:https://hub.docker.com/

docker可以安装在windows ,linux ,macos

docker三件套:
镜像:相当于JAVA的类模版,是一个只读模版,用于创建容器;
容器:相当于JAVA类的实例对象,用镜像创建的运行实例就是容器;
仓库:相当于JAVA的代码仓库maven,放镜像的地方就是仓库;
仓库分为公开库和私有库;

Docker工作原理:
docker是一个client-server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
docker build构建镜像文件;
docker pull拉取镜像文件;
docker run运行镜像文件创建容器实例;

一、Centos上安装Docker:
要求linux内核3.8以上,可以用uname -r查看系统内核版本;
安装文档,可以参考官网install文档;
1.卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
2.安装gcc相关基础包
yum -y install gcc
yum -y install gcc-c++
3.安装yum-utils 
sudo yum install -y yum-utils
4.设置stable镜像仓库,把地址设置成阿里云的仓库地址
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum软件包索引
yum makecache fast
6.安装docker最新版
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7.启动docker
sudo systemctl start docker
8.测试docker
docker version
sudo docker run hello-world
9.停止docker
systemctl stop docker
10.卸载docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

二、配置阿里云镜像加速器:
国内访问 Docker Hub 的速度很不稳定,有时甚至出现连接不上的情况。为 Docker 配置镜像加速器,从而解决这个问题。
常用的镜像加速器有:
阿里云加速器、DaoCloud加速器等。
以阿里云加速器为例:
1、注册阿里云账号,即可在阿里云控制台(https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors);
2、按照阿里云页面提示说明,即可配置镜像加速器。有针对ubuntu,centos,mac,windows的操作文档说明。
为了拉docker镜像更快;
配置步骤:
1、阿里云企业应用中心https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors,可以用手机号登录,登录后,点击控制台;
2、点击弹性计算-容器镜像服务-镜像工具-镜像加速器,复制加速器地址;
我的加速器地址是:
https://nt29kb2i.mirror.aliyuncs.com
3、参考centos文档配置镜像加速器;
centos配置镜像加速器步骤:
1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://nt29kb2i.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
也可以分步骤配置:
sudo mkdir -p /etc/docker
vim /etc/docker/daemon.json
daemon.json内容:
#阿里云
{
  "registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
}
重启docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
测试:
docker run hello-world
如果本地有则,运行本地镜像;本地没有,则下载镜像,运行镜像;

三、docker常用命令分为三类:
帮助启动类命令
镜像命令
容器命令

帮助启动类命令:
● 启动docker: systemctl start docker
● 停止docker: systemctl stop docker
● 重启docker: systemctl restart docker
● 查看docker状态: systemctl status docker
● 开机启动: systemctl enable docker
● 查看docker概要信息: docker info
● 查看docker总体帮助文档: docker --help
● 查看docker命令帮助文档: docker 具体命令 --help

扩展学习:
linux帮助命令man,如查看tar的帮助信息,man tar;
docker全部帮助命令docker --help
docker某个帮助命令docker cp --help
pwd显示当前路径

镜像命令:
查询本机所有镜像
从仓库搜索镜像
从仓库下载镜像
查看空间占用
删除镜像
docker images,列出本地主机上的镜像,options参数说明:docker images -a,列出本地所有镜像(包含历史映象层),docker images -q,只显示镜像ID;
docker search 某个XXX镜像名字,从镜像仓库搜索镜像,docker search --limit 5 redis,--limit 5查询前5个,默认25个;
docker pull 某个XXX镜像名字,可以指定版本号,从仓库下载镜像到本地; 例子:docker pull ubuntu,docker pull ubuntu:latest;
docker system df ,查看镜像/容器/数据卷所占的空间;
docker rmi 某个XXX镜像名字ID,删除镜像,用法:docker rmi -f 镜像ID,删除单个;docker rmi -f 镜像名1:TAG 镜像名2:TAG,删除多个,多个镜像名空格分隔;docker rm -f $(docker ps -a -q)删除全部镜像

扩展学习:
镜像列表结果说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小


容器命令:
新建+启动容器
列出所有正在运行的容器
退出容器
启动已停止运行的容器
重启容器
停止容器
强制停止容器
删除已停止容器
启动守护式容器(后台服务器)
查看容器日志
查看容器内运行的进程
查看容器内部细节
进入正在运行的容器并以命令交互
从容器内拷贝文件到主机上
导入导出容器
详细说明:
前提:
有镜像才能创建容器,要先下载镜像,然后创建容器;
演示docker中安装ubuntu;先下载一个ubuntu镜像,docker pull ubuntu;
1、新建并启动容器:
docker run ubuntu
PTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字"       为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
docker run -it启动交互式容器(有输入命令终端):
docker run  -it ubuntu /bin/bash
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
docker run -it --name myu1 ubuntu bash;
--name指定容器新名字names;不指定则随机命名;
docker run -d 容器名,后台运行;
run了之后,ps查询不到容器,则运行失败;最好用前台运行模式,后台模式会自动结束;


2、列出所有正在运行的容器:
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
访问redis,需要先访问docker;
docker ps:列出所有正在运行的容器实例;
docker ps -a当前活着加历史;
docker ps -l显示最近创建的容器;
docker ps -n显示最近创建的n个容器;
docker ps -q只显示容器ID

容器的停止、删除:
3、退出容器:
run进去,exit退出,容器停止;
run进去,ctrl+p+q退出,容器不停止;
ctrl+c退出

4、启动已经停止的容器:
docker start 容器ID或容器名;
重启容器:
docker restart 容器ID或容器名;
5、停止容器:
docker stop 容器ID或容器名;
6、强制停止容器:
docker kill 容器ID或容器名;(推荐)
7、删除已停止的容器(运行中的容器要先停止再删除 ):
docker rm 容器ID
注意:rmi是删镜像,rm是删容器;
一次性删除多个容器实例:
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

重要命令:
前提:
有镜像才能创建容器,下载一个redis6.0.8镜像演示
8、启动守护式容器(后台服务器):
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。
小总结:web容器,比如nginx,需要前台启动,后台启动会自杀;redis等一直运行的程序,可以后台启动;
演示运行redis:
docker pull redis:6.0.8
docker run -it redis:6.0.8前台交互式启动,命令窗口关闭就没了;
docker run -d redis:6.0.8后台守护式启动,redis推荐后台启动;

9. 查看容器日志
docker logs 容器ID
10. 查看容器内运行的进程
docker top 容器ID
11. 查看容器内部细节
docker inspect 容器ID

12. 进入正在运行的容器并以命令行交互
命令格式1:docker exec -it 容器ID /bin/bash(推荐)
命令格式2:重新进入docker attach 容器ID
上述两个区别?
attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
推荐:推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

13、从容器拷贝文件到主机:
docker cp 容器ID:容器路径  主机下路径;
docker cp d57a939934f2:/usr/local/mycptest/container.txt  /tmp/c.txt
示例步骤:
doker run -it ubuntu /bin/bash
apt update
apt install vim
vim a.txt
再开一个命令窗口
docker cp d57a939934f2:/usr/local/mycptest/container.txt  /tmp/c.txt

14.导入导出容器:
导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
docker export 容器ID > 文件名.tar,导出整个容器为文件;
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号,导入容器文件为镜像;
docker export ad4067624f23>redis.tar
cat redis.tar|docker import - hudong/redis:1.0
docker images

15.其他命令:
build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
commit    Create a new image from a container changes   # 提交当前容器为新的镜像
create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器
diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化
events    Get real time events from the server          # 从 docker 服务获取容器实时事件
history   Show the history of an image                  # 展示一个镜像形成历史
load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]
login     Register or Login to the docker registry server    # 注册或者登陆一个 docker 源服务器
logout    Log out from a Docker registry server          # 从当前 Docker registry 退出
port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口
pause     Pause all processes within a container        # 暂停容器
unpause   Unpause a paused container                    # 取消暂停容器
push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器
save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]
tag       Tag an image into a repository                # 给源中镜像打标签
wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值


四、Docker镜像:
镜像的分层概念:
镜像式分成的;Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。
UnionFS联合文件系统
docker使用主机的linux内核,rootfs只需要提供基本的命令、工具、程序即可,只有170M;
从上到下依次式:可写容器层、镜像层、rootfs、linux内核
重点理解:当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

commit命令通过容器生成新镜像到本机;
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

案例演示ubuntu安装vim:
doker run -it ubuntu /bin/bash进入ubuntu 的容器实例;
apt update
apt install vim
再开一个命令窗口
docker commit -m="add vim cmd" -a="zzyy" 5fakkkkk atguiqu/myubuntu:1.1
docker images
docker run -it atguiqu/myubuntu:1.1 /bin/bash

导出导入可以生成新的镜像;
commit也可以生成新的镜像;

五、本地镜像发布到阿里云:
两种方式构建新镜像:dockerFile build,docker commit;
push镜像到阿里云;
pull从阿里云拉取镜像;
本地镜像推送到阿里云:
1、登录到阿里云页面,https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors;
2、创建阿里云镜像仓库,阿里云页面--镜像服务--个人实例---命名空间(创建命名空间hudong1)、镜像仓库(选择命名空间,创建镜像仓库repo);
用户名hd1400279911
密码Root_123456
公网地址
registry.cn-zhangjiakou.aliyuncs.com/hudong1/repo
专有网络
registry-vpc.cn-zhangjiakou.aliyuncs.com/hudong1/repo
3、推送镜像到阿里云镜像仓库,参考页面文档推送镜像到阿里云;(参考阿里云页面手册)
docker login --username=hd1400279911 registry.cn-zhangjiakou.aliyuncs.com
docker tag 7a0a275d355e registry.cn-zhangjiakou.aliyuncs.com/hudong1/repo:myubuntu1.1
docker push registry.cn-zhangjiakou.aliyuncs.com/hudong1/repo:myubuntu1.1
从阿里云拉取镜像到本地:
docker pull registry.cn-zhangjiakou.aliyuncs.com/hudong1/repo:myubuntu1.1

六、本地镜像发布到私有库:
是什么?
1 、官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
2 、Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库。
将本地镜像推送到私有库:
1、下载Docker Registry镜像:docker pull registry,docker images查看下载的镜像;
2、运行私有库Registry,相当于本地有个私有Docker hub:
docker run -d -p 5000:5000  -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
docker ps,查看容器
3、案例演示创建一个新镜像,ubuntu安装ifconfig命令:
docker run -it ubuntu /bin/bash
apt update
apt install net-tools
ifconfig
提交镜像:
公式:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
命令:在容器外执行,记得
docker commit -m="ifconfig cmd add" -a="zzyy" b3aee733f135 zzyyubuntu:1.2
启动新镜像和原来的对比
docker images
docker run -it zzyyubuntu:1.2 /bin/bash
4、curl验证私服库上有什么镜像:
curl -XGET http://192.168.47.129:5000/v2/_catalog
可以看到,目前私服库没有任何镜像上传过
5、将新镜像Tag修改成符合私服规范的Tag:
按照公式: docker   tag   镜像:Tag   Host:Port/Repository:Tag
自己host主机IP地址,填写同学你们自己的,不要粘贴错误,O(∩_∩)O
使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.111.162:5000/zzyyubuntu:1.2
docker tag  zzyyubuntu:1.2  192.168.47.129:5000/zzyyubuntu:1.2
docker images
6、修改docker配置文件,使之支持http:
别无脑照着复制,registry-mirrors 配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。
2个配置中间有个逗号 ','别漏了,这个配置是json格式的。
vim命令新增如下红色内容:vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.47.129:5000"]
}
上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
重启docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
重新启动registry:
docker run -d -p 5000:5000  -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
docker ps
7、推送镜像到私服库
公式:docker push 镜像ID或名称
docker push 192.168.47.129:5000/zzyyubuntu:1.2
8、curl验证私服库上有什么镜像:
curl -XGET http://192.168.47.129:5000/v2/_catalog
9、从私服库下载镜像到本地运行:
docker pull 192.168.47.129:5000/zzyyubuntu:1.2
docker images
docker run -it fb039e333c32 /bin/bash
ifconfig

七、Docker容器数据卷:
 Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可。使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
是什么?
将容器内目录与宿主机目录挂载同步,将docker容器内的文件自动保存进宿主机的磁盘中。
公式:
docker run -it --privileged=true -v /宿主机目录绝对路径:/容器内目录路径 镜像名
能干嘛?
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
数据卷案例:
1、宿主机与容器之间添加映射容器数据卷
直接命令添加数据卷:
docker run -it --privileged=true -v /宿主机目录绝对路径:/容器内目录路径 镜像名
docker run -it --privileged=true -v /tmp:/xyz  7a0a275d355e
查看数据卷是否添加成功:
docker inspect 容器ID,查看Mounts中的Source,Destination(试过了,看不到Mounts),只要上一步成功就行
测试宿主机与容器之间数据共享:
在容器内执行vim a.txt,输入255
在宿主机vim /tmp/a.txt 同样可以看到修改内容;
在宿主机修改a.txt,容器内同样可以看到修改内容;
2、添加容器数据卷时,添加读写规则
不加默认w,可读写
docker run -it --privileged=true -v /tmp:/xyz:rw  7a0a275d355e
容器实例内部只读ro
docker run -it --privileged=true -v /tmp:/xyz:ro  7a0a275d355e
3、容器数据卷可以从已有的容器继承配置:
比如容器u2继承容器u1的数据卷配置:
为容器u1添加数据卷配置:
docker run -it --privileged=true -v /tmp:/xyz  --name u1 7a0a275d355e
容器u2直接继承容器u1的数据卷配置(通过--volumes-from标志实现):
docker run -it --privileged=true --volumes-from u1  --name u2 7a0a275d355e

容器卷可以备份和持久化数据在主机目录,删除容器时容器卷数据不会删除;
运行一个带有容器卷的容器实例:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
公式:docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash
数据卷的共享和继承;

八、docker上常规软件安装:(待实践)
mysql
redis
rabbitMq
总体步骤:搜索镜像、拉取镜像、查看镜像、启动镜像


安装tomcat:
docker search tomcat
docker pull tomcat
docker images tomcat
docker run -d -p 8080:8080 --name t1 tomcat
访问404:
关闭防火墙;
rm -r webapps;
mv webapps.dist webapps;
可以安装带jdk的免修改版;

安装mysql:
ps -ef|grep mysql
docker pull mysql:5.7
docker images mysql:5.7
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
插入中文报错:
设置编码;
删除容器后,mysql数据怎么办?必须挂数据卷
实战版安装:
docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -eMYSQL_ROOT_PASSWORD=123456  --name mysql mysql:5.7
解决乱码:
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

安装redis:
docker pull redis:6.0.8
docker images redis:6.0.8
docker run -d -p 6379:6379 redis:6.0.8
测试:
redis-cli
set k1 v1
get k1
实战版安装:
创建主机redis目录,拷贝redis原生配置文件到目录
mkdir -p /app/redis
cp /myredis/redis.conf /app/redis/

docker run  
-p 6379:6379 
--name myr3 
--privileged=true 
-v /app/redis/redis.conf:/etc/redis/redis.conf 
-v /app/redis/data:/data 
-d redis:6.0.8 redis-server /etc/redis/redis.conf

高级篇:
一、docker复杂安装:
mysql主从集群;
redis集群安装;主从扩展;主从缩容;

二、DockerFile解析:
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
之前是每次容器修改完之后commit来生成镜像,现在是在Dockerfile list清单中一次写好,然后构建镜像;
官网dockerFile Reference
DockerFile构建三步骤:
编写DockerFile文件;
docker build命令构建镜像;
docker run依镜像运行容器实例;

Dockerfile内容基础知识:
1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数;
2. 指令按照从上到下,顺序执行;
3. #表示注释;
4. 每条指令都会创建一个新的镜像层并对镜像进行提交;

Docker执行DockerFile大致流程:
1、docker从基础镜像运行一个容器;
2、执行一条指令并对容器做出修改;
3、执行类似docker commit的操作提交一个新的镜像层;
4、docker基于刚提交的镜像运行一个新容器;
5、执行dockerfile中的下一条指令直到所有指令执行完成;
小总结;
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
*  Dockerfile是软件的原材料
*  Docker镜像是软件的交付品
*  Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。


DockrFile常用保留字指令:
FROM  基础镜像,当前新镜像是基于哪个镜像的,指定一个已存在的镜像作为模版,第一条必须是from
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN  容器构建时需要运行的命令,两种格式shell或exec,RUN是在docker build时运行;
        shell格式: RUN <命令行命令>,如RUN yum -y install vim
        exec格式: RUN ["可执行文件","参数1","参数2"],如RUN ["./test.php","dev","offline"]等价于RUN ./test.php dev offline 
EXPOSE   当前容器对外暴露的端口
WORKDIR  指定在创建容器后,终端默认登录的工作目录,一个落脚点
USER  指定该镜像以什么样的用户去执行,如果不指定默认是root
ENV  用来在构建镜像过程中设置环境变量,如ENV MY_PATH /usr/mytest,也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH
ADD  将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY  类似ADD,拷贝文件和目录到镜像中。COPY  src desc
VOLUME  容器数据卷,用于数据保持和持久化工作;
CMD  指定容器启动后要要干的事情;Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
注意:CMD是在docker run 时运行;RUN是在 docker build时运行。
ENTRYPOINT 也是用来指定一个容器启动时要运行的命令;类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
优点:
在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

案例:
编写Dockerfile:  vim Dockerfile
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

案例构建:
docker build -t 新镜像名字:TAG .   
docker build -t centosjava8:1.5 .
注意:TAG后面有个空格,有个点

案例运行:
docker run -it 新镜像名字:TAG
docker images
docker run -it centosjava8:1.5 /bin/bash
java -version

虚悬镜像:
仓库名、标签都是none的镜像
查看:docker image ls -f dangling=true
删除:docker image  prune

三、Docker微服务实战:
1IDEA新建module;
2打包成jar;
3Dockerfile内容:
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001

4将微服务jar包和Dockerfile文件上传到同一个目录下/mydocker
5构建镜像
docker build -t zzyy_docker:1.6 .
6运行容器
docker run -d -p 6001:6001 zzyy_docker:1.6
curl 127.0.0.1:6001/order/docker
curl 127.0.0.1:6001/order/index
7访问测试

四、Docker网络:
1、是什么?
docker不启动,默认网络情况:
ifconfig查看会返回3个网卡ens33(宿主机IP),lo(本机IP127.0.0.1),virbr0(虚拟网桥);
docker启动后,网络情况:
ifconfig查看会看到一个名为docker0的虚拟网卡;默认创建3大网络模式bridge,host,none,docker network ls查看;
2、常用基本命令
查看所有docker网络命令:docker network --help
查看网络:docker network ls
查看网络源数据:docker network inspect 网络名字
删除网络:docker network rm 网络名字
案例:
docker network create aa_network
docker network ls
docker network rm aa_network
docker network ls
3、能干嘛?
容器间的互联和通信以及端口映射;
容器IP变动时可以通过服务名直接网络通信,不受影响;
4、网络模式
docker run 命令,可以通过--network bridge/host等设置网络模式;bridge每个容器有自己的IP、端口,host使用宿主机的IP、端口,host相当于在宿主机安装;
bridge模式:使用--network bridge指定,默认使用docker0;(为每一个容器分配、设置IP,并将容器连接到docker0,虚拟网桥,默认为该模式;)
host模式:使用--network host指定(使用宿主机的IP和端口,容器不会虚拟主机的网卡、配置主机的IP)
none模式:(一般不用该模式)使用--network noen指定(容器有独立的Network Namespace,但没有对其进行任何网络设置)
container模式:使用--network container:Name或容器ID指定(新创建的容器不创建自己的网卡、不配置自己的IP,而是和指定的容器共享IP、端口范围。相当于借用别人的)

 
容器实例默认网络IP生产规则:
docker容器IP是可能发生改变的;
docker inspect u1;net work是网络配置信息;
在容器内部,使用ip addr查看网络配置信息;

案例说明:
bridge,  可以指定端口
host , 不能指定端口,使用宿主机端口
none,
container,
container例子:
docker run -it  --name alpine1 alpine /bin/sh
ip addr
docker run -it  --network container:alpine1 --name alpine2 alpine /bin/sh
ip addr
如果关闭alpine1容器,alpine2则只有本地回环地址127.0.0.1
自定义网络,
为什么要用自定义网络?
两个容器,如果是两个固定的IP,172.17.0.2和172.17.0.3,相互ping ip是可以ping通的;
但容器的IP是变化的,只能按服务名去ping;两个容器,相互ping容器名,报错;
自定义网络用法:
多个容器加到同一个自定义网络,就可以通过容器名ping通;
默认使用bridge模式;
新建一个自定义网络:
docker network create zzyy_network
新建容器加入同一个自定义网络
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 tomcat
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 tomcat
测试
docker exec -it tomcat81 bash
apt-get update
apt-get install inetutils-ping
ping tomcat 82
docker exec -it tomcat82 bash
apt-get update
apt-get install inetutils-ping
ping tomcat 81

五、Docker-compose容器编排
是什么?
Docker-compose是Docker官方提供的开源工具,用于对docker集群的快速编排;
可以管理多个容器组成一个应用,只需要定义一个配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令就能同时启动/关闭这些容器。
docker建议一个容器运行一个服务;
copose允许用户通过个单独的docker-compose.yml模版文件来定义一组关联的应用容器为一个项目(project);

compose下载安装步骤:
查看官网:
Compose file reference
有version2和version3,推荐使用version3;
compose版本需要和docker引擎版本匹配;
安装步骤:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
卸载步骤:
sudo rm /usr/local/bin/docker-compose

compose核心概念:
一个文件:docker-compose.yml
两个要素:
     服务(service),一个个应用容器实例;
     工程(project),由一组关联的应用容器组成的完整业务单元,在docker-compose.yml中定义。

compose使用的三个步骤:
编写Dockerfile定义各个微服务并构建出镜像文件;
使用docker-compose.yml定义一个完整的业务单元,安排好各个容器服务;
使用docker-compose up命令启动整个应用(相当于运行了多个docker run)

compose常用命令:
docker-compose -h                           # 查看帮助
docker-compose up                           # 启动所有docker-compose服务
docker-compose up -d                        # 启动所有docker-compose服务并后台运行
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id                 # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     # 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     # 查看容器输出日志
docker-compose config     # 检查配置
docker-compose config -q  # 检查配置,有问题才有输出
docker-compose restart   # 重启服务
docker-compose start     # 启动服务
docker-compose stop      # 停止服务
docker-compose rm删除已停止的服务;

compose编排微服务:
编写docker-compose.yml文件;
编写Dcokerfile文件;
上传docker-compose.yml、Dcokerfile、jar到/mydocker目录;
构建JAR镜像:docker build -t zzyy_docker:1.6 .
一键启动:docker-compose up或docker-compose up -d
添加数据库表:
docker exec -it 容器实例id /bin/bash
mysql -uroot -p
create database db2021;
use db2021;
CREATE TABLE `t_user` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
  `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
  `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
测试:
打开接口页面测试;
一键关闭:docker-compose stop

docker-compose.yml说明:
version ,compose版本号
services,服务
image,镜像
container_name,容器名
ports,端口
volumes,数据卷映射
networks,网络配置
depends_on,依赖

六、Docker轻量可视化工作Portainer
是什么?
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
https://docs.portainer.io/start/install-ce
解决的问题:
容器越来越多,需要监控、统计;
安装Portainer:
docker run -d -p 8000:8000 -p 9000:9000 --name portainer     --restart=always     -v /var/run/docker.sock:/var/run/docker.sock     -v portainer_data:/data     portainer/portainer
映射了多个端口,多个数据卷,随docker自动启动
访问Portainer:
http://192.168.47.129:9000
用户名,直接用默认admin
密码记得8位,随便你写,12345678
登录后,选择local监控本地容器;
界面介绍:
stack是compose编排;
可以管理compose编排、容器、镜像、网络、数据卷;

七、Docker重量级容器监控CAdvisor+InfluxDB+Granfana
简称CIG
CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

CIG结合compose一键搭建监控平台:
创建目录/mydocker/cig
上传docker-compose.yml到cig目录
docker-compose up一键安装
3个组件有各自的访问地址;
存储需要添加数据源;
展示需要添加图表,添加


 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值