Docker学习笔记
记录一份Docker一、什么是Docker?Docker是一项容器技术,是一个开源的应用容器引擎。可以让开发者打包自己的软件以及相关依赖到一个可移植的容器中,然后发布到Docker仓库上面。运维工作人员从中下载获取镜像,通过Docker程序运行这个镜像,生成容器,就可以获取相同的软件环境。实现了“一次构建,处处运行”。解决了开发者和运维者在开发时和部署时因项目环境...
·
记录一份
Docker
一、什么是Docker?
Docker是一项容器技术,是一个开源的应用容器引擎。
可以让开发者打包自己的软件以及相关依赖到一个
可移植的容器中,然后发布到Docker仓库上面。
运维工作人员从中下载获取镜像,通过Docker程序
运行这个镜像,生成容器,就可以获取相同的软件环境。
实现了“一次构建,处处运行”。
解决了开发者和运维者在开发时和部署时因项目环境不同
而导致的各种矛盾,从而影响业务进度,使得业务不能适应
快速变化的市场。
可以简单地把Docker理解为是一个虚拟机
Docker是基于UnionFS联合文件系统,是一种分层的结构
分层结构:共享资源,便于复用(很多镜像都是基于一个Base基础镜像构建而来)
二、Docker与传统虚拟软件的区别
传统虚拟软件:
模拟一个完整的操作系统,首先虚拟出一套硬件,
再安装操作系统,再运行各种软件。
更偏向硬件方向的运营
Docker容器技术:
不是模拟一个完整的操作系统,也没有进行硬件虚拟。
而是对进程进行隔离,封装成容器,容器内的应用程序
直接使用宿主机的内核资源,且容器采用沙箱机制,
互相隔离,彼此独立,是安全的。
更偏向软件方向的运营
三、术语
1)Docker主机(Host)
安装了Docker程序的主机
2)Docker镜像(Image)
就是一个将软件环境打包好的模板,
用来创建容器。
一个镜像可以创建多个容器
3)Docker容器(Container)
就是镜像运行后的实例,可以启动、停止、删除等等
容器采用沙箱机制,互相隔离,彼此独立,是安全的。
可以简单地把容器看作是一个简易版的linux环境。
4)Docker仓库(Repository)
用来存放镜像,每一个镜像都有一个标签
Docker
(1)安装
前提:对于Linux, 64位linux操作系统,内核3.10以及以上
Step1:
yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
yum install -y yum-utils \
> device-mapper-persistent-data \
> lvm2
yum-config-manager \
> --add-repo \
> https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
(2)验证
docker version
docker info
(3)启动
systemctl enable docker
systemctl start docker
(4)镜像加速
https://hub.daocloud.io/
--->
加速器
--->
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl daemon-reload
systemctl restart docker
docker -H IP # 连接指定主机的docker
Docker操作:
一、镜像操作
查找 docker search 关键字 在DockerHub上面查找关于该关键字的详细信息
拉取 docker pull 镜像名称:tag tag就是版本,不指定就拉取最新latest的版本
查看 docker images 查看所有镜像
元信息 docker inspect 镜像名称or镜像id 查看对应镜像的元信息
删除 docker rmi -f 镜像名称or镜像id ... 删除一个或多个镜像,选项-f表示强制删除
变更历史 docker history 镜像名称or镜像id 查看对应镜像的变更历史
导出镜像 docker save [-o] [xx.tar] 镜像名称orID ... 导出一个或多个镜像到一个tar文件
docker save -o nginx.tar nginx:v1 34df
or
docker save > nginx.tar nginx:v1 34df
导入镜像 docker load [-i] tar文件 导入tar包中的镜像(会保留历史记录)
docker load -i nginx.tar # 不能重新命名
-q # 安静
or
docker load < nginx.tar
二、容器操作
运行 docker run --name <容器名字> 镜像名称orID [sh cmd][args] # 可以不指定,会自动命名
-t # 分配一个伪终端,用来执行命令
-i # 以交互模式运行容器
[sh cmd] 是指在容器运行时执行的shell命令,想让这个命令正常工作,不能以-d模式启动
[args] 可以指定sh cmd需要的参数
-d # 以守护进程方式在后台运行
-p 主机端口:容器端口 # 指定端口映射,将主机端口映射到容器内的端口(容器内的APP端口可以通过元信息获取)
-v 主机路径:容器路径:权限 # 指定挂载,将主机路径挂载到容器内路径,默认权限为rw(表示容器对此目录可读可写)
# 既可以以文件形式挂载,也可以以目录形式挂载
-e MY_PASSWORD=root # 指定环境变量
# -v 参数可以有多个
停止 docker stop 容器名字or容器id ... # 停止正在运行的一个或多个容器(优雅退出)
启动 docker start 容器名字or容器id ... # 启动一个或多个容器
重启 docker restart 容器名字or容器ID ... # 重启一个或多个容器
重命名 docker rename 容器名字orID NEW_NAME # 重命名容器名字
杀死 docker kill 容器名字orID ... # 杀死一个或多个容器(暴力退出)
查看 docker ps -q -a # 查看容器,默认只查看正在运行的容器
# -a 表示查看所有的容器
# -q 表示只显示容器id
元信息 docker inspect 容器名称or容器id # 查看容器元信息
查看日志 docker logs 容器名称or容器id # 查看容器运行日志
查看版本 docker version # 查看docker版本信息
查看详细信息 docker info # 查看操作系统以及docker使用的信息
执行命令 docker exec -it 容器名称or容器id 命令 # 往容器内执行Shell命令
# 如果想进入容器内,命令为/bin/bash,而且必须带有-it选项
# 如果不想进入容器,执行一般命令,可以不用加-it
拷贝文件 docker cp 主机文件路径 容器名称orID:容器路径 # 将主机中的文件拷贝到容器内
or
容器名称orID:容器路径 主机文件路径 # 将容器内的文件拷贝到主机内
导出容器 docker export [-o] [xx.tar] container # 导出容器到一个tar文件,但最后会恢复成镜像
or # 不会保留历史记录
docker export -o nginx.tar nginx
docker export nginx > nginx.tar
导入容器 docker import nginx.tar nginx:tmp # 导入容器,可以重新命名
cat nginx.tar | docker import - nginx:tmp
三、创建镜像
(1)更新镜像
基于已有的基础镜像运行的容器实例,对其进行修改,然后commit成新的镜像
docker commit -a "hardy9sap@163.com # Author" -m "Comment message" 容器名称orID itany/nginx:v1.0
说明:
-a -m 都是可选的
itany/nginx:v1.0 中的itany/ 可选,表示命名空间;:v1.0 可选,表示版本tag
整体itany/nginx:v1.0 都是可选的,那么默认镜像名字以及标签都为<none>
(2)构建镜像
基于Dockerfile,对已有镜像进行修改,然后build成新的镜像
Dockerfile是一个包含创建镜像所需的所有指令的文本文件
docker build -f Dockerfile -t itany/nginx:v2.0 .
说明:
-f 指定Dockerfile路径,默认就是当前路径下的Dockerfile
-t 指定新镜像名称和版本
. 表示上下文,一般就是.表示当前路径
Docker镜像为什么那么大?
因为镜像是包含了所有了运行该软件的所有环境,
所以那么大。
每一层镜像只会在本地保留一份。
再拉取一个镜像的时候,如果所需的镜像层已经在本地有了,
就不需要再拉取一遍。
四、Dockfile指令
规则:
1. 全部指令以大写字母书写
2. 以FROM指令开头
3. 从上往下执行
4. # 表示注释
5. 每执行一条命令,就增加一层镜像层
常用指令:
FROM 指定基础镜像
FROM itany/nginx:v2.0
ENV 定义环境变量
ENV MYPATH /usr/local
RUN 运行一条指令
RUN yum install -y vim
使用 && 来执行多条
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
CMD 在镜像生成容器时指定的命令(也就是run命令)
CMD ["/bin/bash"] # CMD指令虽然可以有多个,但是以最后一个CMD指令为准
CMD ["/bin/ls", "/"] # 可以为主命令指定参数
# CMD指令会被run时指定的命令覆盖掉
VOLUME 指定挂载目录,(实现资源共享,数据持久化)
只能指定镜像中的目录,
无法指定宿主机的目录,宿主机的目录是自动生成的,可通过容器元信息获得
VOLUMN ["/data1", "/data2"]
WORKDIR 指定当登录容器后,进入的工作目录,
不指定,默认为/目录
WORKDIR $MYPATH
MAINTAINER 维护者(作者)
MAINTAINER hardy9sap@163.com
ENTRYPOINT 与CMD类似,
# ENTRYPOINT指令也可以有多个,也是以最后一个指令为准
# 可以为主命令指定参数
# ENTRYPOINT指令不会覆盖run时指定的命令,而是会当作ENTRYPOINT指令的参数,组成新的指令
# 就理解为拼接在了一起
关于执行指令:
如果最后一条指令不是/bin/bash的话
指定你指定的命令后,容器退出,
之后再怎么重启容器都不会生效。
只能删除,再次启动并且指定/bin/bash(当然ENTRYPOINT会把它当做参数,所以要留意一点)
EXPOSE # 暴露端口
# EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!
# 如果你不用-p或者-P(随机选主机的一个端口进行映射)中指定要映射的端口,你的容器是不会映射端口出去的,
EXPOSE 8080 8090
COPY # 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
COPY <src> <dst>
COPY file.txt /usr/local
COPY和ADD所拷贝的文件必须跟Dockerfile保持在同一目录下
(因为build时,默认指定的上下文就是当前目录,也就是我们写的那个.)
(当然你可以改变上下文,例如:/etc/local)
可以使用通配符* 和 ?
ADD # 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
# 如果是压缩文件直接解压
ADD <src> <dst>
ADD nginx.tar.gz /usr/local/nginx
五、发布镜像到阿里云开发者平台
Step1: https://homenew.console.aliyun.com/
Step2: 创建命名空间
Step3: 创建镜像仓库
摘要:仓库的摘要
描述:镜像的描述
Step4: 管理 --> 操作指南
将镜像推送到Registry
# 登录阿里云Docker Registry
docker login --username=空灵飘渺之旅sap registry.cn-shenzhen.aliyuncs.com
--password=密码(太复杂的密码不适用)
-u
-p
# 创建指定镜像的tag,归入某个仓库
docker tag [ImageID] registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
# 推送
docker push registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。
推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。
公网地址
registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
专有网络
registry-vpc.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
经典网络
registry-internal.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
#从Registry拉取镜像
docker pull registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
# 退出登录
docker logout [registry.cn-shenzhen.aliyuncs.com/] # 不指定默认登出DockerHub
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)