docker 学习总结
Docker 是一个容器工具,提供虚拟环境。解决了软件的环境配置和依赖问题,让软件可以带环境和依赖的安装。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
1. 注册 docker 账号
想要使用docker,先注册一个docker账号,注册docker账号。
注册完成后,登录到 docker hub 就能看到自己的 docker 镜像了,docker hub 是 docker 官方存放 docker 镜像的仓库。如我的 hub 下列出了我push的镜像
2. docker 的安装
注册完docker账号,然后安装docker:
window 10
Mac OS
window 10 安装 docker 19.03.2 百度网盘地址
安装完成后可以通过命令docker version
来查看docker的版本号
C:\Users\lixinjie>docker version
Client: Docker Engine - Community
Version: 19.03.2
API version: 1.40
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:26:49 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:32:21 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
出现版本号,证明安装成功。
下面使用 Mac OS 系统来演示命令,和输出结果。
3. image文件
docker主要有三部分核心内容,image 文件,容器文件和 Dockerfile 文件。image文件也称为镜像。
运行这些 docker 命令行前,需要打开 docker 终端,也就是上一步下载的 docker app。否则将会报错
➜ ~ docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
3.1. 列出所有 image 文件
- 列出所有镜像,不包含中间层镜像
docker image ls
或docker images
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
count-web_web latest b9f43a85e594 4 days ago 106MB
dockerhub.datagrand.com/datagrand/text_similarity_html dev_20191022_103543 be10d00a971c 4 days ago 134MB
redis alpine 6f63d037b592 4 days ago 29.3MB
python 3.6-alpine 6ddaac33408f 4 days ago 95MB
ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
- 上面镜像只截取了部分
- REPOSITORY 表示镜像名
- TAG 表示镜像标记,通常是版本号,或者其他可以区别镜像不同版本的标记
- IMAGE ID 表示镜像 ID,镜像可以通过
<REPOSITORY>:<TAG>
来识别,也可以通过<IMAGE ID>
来识别- CREATED 表示这个镜像制作的时间
- SIZE 表示这个镜像的大小
- 列出所有虚悬镜像
docker image ls -f dangling=true
➜ ~ docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
- 表示没有虚空镜像
- 列出所有镜像,包含中间层镜像
docker image ls -a
或docker images -a
➜ ~ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
count-web_web latest b9f43a85e594 4 days ago 106MB
<none> <none> a1f88c27d11b 4 days ago 106MB
<none> <none> a16622d4261d 4 days ago 95MB
<none> <none> bff6538a770e 4 days ago 95MB
dockerhub.datagrand.com/datagrand/text_similarity_html dev_20191022_103543 be10d00a971c 4 days ago 134MB
<none> <none> 664a0ea6f623 4 days ago 126MB
<none> <none> 349fc9312606 4 days ago 134MB
redis alpine 6f63d037b592 4 days ago 29.3MB
python 3.6-alpine 6ddaac33408f 4 days ago 95MB
ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
出现了很多无标签的镜像,与之前的虚空镜像不同,这些无标签的镜像很多都是中间层镜像,是其他镜像的依赖对象,只要删除了这些中间层镜像,这些依赖他们的镜像也将会被删除。
- 列出指定镜像
docker images <image-name>
根据镜像名来列出镜像
➜ ~ docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
ubuntu latest 2ca708c1c9cc 5 weeks ago 64.2MB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
ubuntu 13.10 7f020f7bf345 5 years ago 185MB
- latest 表示当前最新版本的镜像
3.2. 删除指定 image 文件
删除image文件前,要先删除容器文件
- 通过文件名:标签删除
docker image rm <image name>:<tag>
或 docker rmi <image name>:<tag>
标签名缺省是latest,如果标签名是latest,则不用添加标签名
docker rmi <image name>:latest
等价于 docker rmi <image name>
➜ ~ docker image rm ubuntu:13.10
Untagged: ubuntu:13.10
Untagged: ubuntu@sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Deleted: sha256:7f020f7bf34554411031ec0d4f2ab46a2976dad403e1c26bc21dc1bf4c48c8aa
Deleted: sha256:2aac093d13faafda4d0da3534d30274bcc4e5475b1e126c84b9d670862f5e4ef
Deleted: sha256:c676fe3dd3ceb6442e8b23350de88adc6546a52f75bd92dbb1a789b7c6de0fcf
Deleted: sha256:7c6a37fb8fe6a41aaf7c6c7a2cc3d448c01df026b2056a9f35e490e7bf6285cc
Deleted: sha256:b0e8be8278c28daa541ad564fc91dbea99263caa6e5e68db033061c5e08f0315
Deleted: sha256:78dcbd700c6678a7af4422e0ad516628852973a255526f4b617f33db218e1075
Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
- Untagged,删除镜像是会先将满足我们要求的所有镜像标签都取消
- Deleted,该镜像的所有的标签都被取消了,该镜像就失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此删除的时候也是从上层向基础层依次进行判断删除。并且给出了完整的sha256的摘要
- 通过文件ID删除
docker image rm <image ID>
或 docker rmi <image ID>
➜ ~ docker image rm cf0f3ca922e0
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36
删除了 ubuntu TAG 为 18.04 的镜像,之后在列出 ubuntu 镜像,就没有这个镜像了。
➜ ~ docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2ca708c1c9cc 5 weeks ago 64.2MB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
ubuntu 13.10 7f020f7bf345 5 years ago 185MB
3.3. 抓取 image 文件
docker pull <image name>
或 docker image pull <image name>
抓取刚删除的 ubuntu:13.10 镜像。
➜ ~ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
[DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the docker.io registry NOW to avoid future disruption.
a3ed95caeb02: Pull complete
0d8710fc57fd: Pull complete
5037c5cd623d: Pull complete
83b53423b49f: Pull complete
e9e8bd3b94ab: Pull complete
7db00e6b6e5e: Pull complete
Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Status: Downloaded newer image for ubuntu:13.10
docker.io/library/ubuntu:13.10
- 默认抓取的地址是官方的 hub,docker hub,官方存放镜像的位置默认在 library 目录下
- 在抓取的时候,先有一个下载的过程,镜像是多层存储所构成,分层下载,并非单一文件,下载过程中给出了每一层的前 12 位 ID
- 下载结束后,显示 pull complete,并给出该镜像的完整
sha256
摘要
3.4. 运行 image 文件
- 通过文件名运行
docker run <image name>:<tag>
或 docker container run <image name>:<tag>
如果文件名不加标签,会使用 latest 标签
docker run <image name>
等价于docker run <image name>:latest
➜ ~ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
运行最简单的 hello-world, 运行完之后,自动停止了。
- 通过文件ID运行
docker run <image ID>
或 docker container run <image ID>
3.5. 创建 image 文件
docker image build
docker image build -t <image name>:<tag> .
-t 指定 image 文件,最后的 . 表示上下文环境,Dockerfile 在当前路径
docker build -t dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW} -f docker/Dockerfile .
- 上面镜像名字中包含了镜像存储的地址,还包含了${TIMENOW}这个是一个变量,表示当前时间 TIMENOW=
date +%Y%m%d_%H%M%S
- -f 表示过滤条件
3.6. 发布 image 文件
当 image 文件创建成功后,就可以把它 push 到 hub 上,供其他人使用了。
首先登录 hub,不指定 hub 时,将会登录到 docker hub。
➜ ~ docker login dockerhub.datagrand.com
Username: lxj327460773
Password:
- 登录到 dockerhub.datagrand.com
- 没有带参数时,会单独要求输入 Username 和 Password
- 登录成功后会显示 Login Succeeded
可以带参数登录,一次性输入账号和密码
➜ ~ docker login dockerhub.datagrand.com -u lixinjie@datagrand.com -p <password>
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
不过这样不安全,因为直接把密码明文显示了,所以才会提示“通过CLI使用密码是不安全的”。
登录成功后,可以 psuh 到 hub 了。
docker push dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW}
完成发布后,可以退出。
➜ ~ docker logout dockerhub.datagrand.com
Removing login credentials for dockerhub.datagrand.com
WARNING: could not erase credentials: error erasing credentials - err: exit status 1, out: `error erasing credentials - err: exit status 1, out: `The specified item could not be found in the keychain.`
退出成功后会提示“删除登录凭证”。
4. 容器文件(container)
容器的实质是进程,容器进程运行于属于自己的独立的命名空间。容器也是分层存储,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层。
4.1. 列出容器文件
- 列出正在运行的容器文件
docker container ls
或 docker ps
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
667e9e3802fb nginx "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 80/tcp vigilant_ardinghelli
- CONTAINER ID 表示容器 ID
- IMAGE 表示运行的镜像,镜像和容器的关系,就像是面向对象程序设计中
类
和实例
一样,镜像是静态的定义,容器是运行时的实体- CREATED 表示运行的时间
- STATUS UP表示运行
- PORTS 表示可以通过指定的端口号来访问
- NAMES 表示对镜像容器的描述
- 列出所有的容器文件(包括停止运行的容器)
docker ps -a
或 docker ps --all
或 docker container ls -a
或 docker container ls --all
➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abb2922a4208 hello-world "/hello" 11 minutes ago Exited (0) 11 minutes ago lucid_gauss
667e9e3802fb nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 80/tcp vigilant_ardinghelli
42f7edad7bfd php "docker-php-entrypoi…" 16 minutes ago Exited (0) 16 minutes ago elegant_mestorf
4441f09a1cc1 httpd "httpd-foreground" 17 minutes ago Exited (0) 16 minutes ago jolly_agnesi
6a7f573b8164 ubuntu "/bin/bash" 4 days ago Exited (0) 4 days ago nervous_pascal
- COMMAND 表示表示容器启动后运行的命令
- STATUS UP表示运行,Exited表示已经停止运行了
4.2. 终止容器文件
- 通过容器ID终止
docker stop <container ID>
或 docker kill <container ID>
或 docker container stop <container ID>
或 docker container kill <container ID>
➜ ~ docker stop 667e9e3802fb
667e9e3802fb
终止容器会显示容器 ID。
- 通过容器名终止
docker stop <container name>
或 docker kill <container name>
或 docker container stop <container name>
或 docker container kill <container name>
4.3. 删除容器文件
删除容器前,必须先终止容器
- 使用容器ID删除容器
docker rm <container ID>
➜ ~ docker rm 667e9e3802fb
667e9e3802fb
删除容器也会显示容器 ID。
- 使用容器名删除容器
docker rm <container>
4.4. 生成容器
docker container run
携带一些参数指明容器运行的端口和启动后执行的命令,如:
docker container run -p 8000:3000 -it <image name>:<tag> /bin/bash
- -p参数:容器的 3000 端口映射到本机的 8000 端口。
- -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
- /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
➜ ~ docker images koa-demos
REPOSITORY TAG IMAGE ID CREATED SIZE
koa-demos v1 0e9ae611c443 10 days ago 675MB
➜ ~ docker container run -p 8000:3000 -it koa-demos:v1 /bin/bash
root@4e165e3a70a7:/app# pwd
/app
root@4e165e3a70a7:/app# ls
Dockerfile README.md demos logo.png node_modules package-lock.json package.json
root@4e165e3a70a7:/app#
我先查找了我的镜像,然后运行了它,并启动了 bash,保证了 shell 命令可用。
5. Dockerfile文件
Dockerfile 中的每一条指令都会建立一个层。
FROM nginx:stable
RUN mkdir -p web/logs
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY dist web/dist
EXPOSE 80
如上的 Dockerfile 文件中
- FROM 指定基础镜像为 nginx,版本为 stable
- RUN 运行命令,新创建文件夹 web,并在其下创建文件logs
- COPY 把 docker 下的 nginx.conf 文件,和 dist 文件夹拷贝到指定位置,这里因为项目使用的 angular 所以,build 之后的文件就存储在 dist 目录下
- EXPOSE 申明容器使用 80 端口
5.1.FROM指定基础镜像
基础镜像必须指定,FROM指令指定基础镜像,因此一个 Dockerfile 文件中 FROM 是必备指令,而且是第一个指令。
FROM scratch
指定一个空白镜像,scratch 不以任何镜像为基础,接下来写的指令将作为镜像第一层开始存在。
5.2. RUN执行命令行
RUN
是用来执行命令行命令的指令
5.3. COPY复制文件
COPY
指令将从构建上下文中目录中<原路径>的文件/目录复制到新一层镜像的的<目标路径>位置
5.4. ADD更高级的复制文件
仅在需要自动解压缩的情况下才使用ADD指令,如果只是复制文件就使用COPY指令
5.5. CMD容器启动命令
用于指定默认的容器主进程的启动命令
5.6. EXPOSE声明容器使用端口
-p <宿主端口>:<容器端口>
- -p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问
EXPOSE
仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
5.7. ENTRYPOINT入口点
5.8. WORKDIR指定工作目录
5.9. VOLUME 定义匿名卷
docker 学习总结的更多相关文章
- Docker学习总结
本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...
- Docker学习笔记 — 配置国内免费registry mirror
Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror
- docker学习笔记1 -- 安装和配置
技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...
- docker学习资料整理(持续更新中..)
docker最近可以说火得一踏糊涂,跟 51大神在交流技术的时候这个东西会多次被提到,当我们还玩vm+linux/freebsd的时候,人家已经上升到更高层次了,这就是差距,感觉好高大上的样子,技术之 ...
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
- Docker学习总结之Run命令介绍
Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...
- docker~学习笔记索引
回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...
- Docker学习笔记 - Docker容器内部署redis
Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...
- docker学习笔记(一)—— ubuntu16.04下安装docker
docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...
- Docker 学习8 Dockerfile详解2
一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...
随机推荐
- web前端如何性能优化提高加载速度
前端优化有以下几种途径: 一.减少HTTP请求数量和次数: 二.使用CDN: 三.添加Expires头: 四.压缩组件: 五.将样式表放在头部: 六.将脚本放在底部: 七.避免CSS表达式: 八.使用 ...
- 【城市天气】使用Ajax发送和接受数据
任务:利用中国天气网的公开接口,实现天气预报的查询功能 实验的功能要求如下: (1)当网页加载时,根据所给的 json 数据解析获得省(直辖市)的信息并显示在下拉列表框中供用户选择: (2)当用户选择 ...
- Python列表生成式练习
''' 如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错 使用内建的isinstance函数可以判断一个变量是不是字符串: 返回True 或 Fal ...
- UFUN函数 UF_ATTR函数(UF_ATTR_read_value 函数用法)
//此函数的功能是输入tag值,返回与属性标题对应的属性值 static string read_attr(tag_t object_tag) { UF_initialize(); ]="零 ...
- Linux下的C++ socket编程实例
阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...
- Linux 系统管理——系统安全及应用
chagen -d 0 ____用户名:下次登录时必须修改密码 ctrl+R:查看历史记录 history:查看历史记录 清除历史记录: >.bash _history echo“”>.b ...
- APIO2019 游记
\(\text {Cu}\)滚粗了,滚粗选手不配拥有游记.
- nginx之http反向代理多台服务器
Nginx http 反向代理高级应用 是Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发.权重分配.状态监测.调度算法等高级功能. http upstream ...
- nginx 访问控制之 location
在生产环境中,我们会对某些特殊的请求进行限制,比如对网站的后台进行限制访问. 这就用到了location配置. 示例1: location /aming/ { deny all; } 说明:针对/am ...
- 拦截RestTemplate的请求
RestTemplate一般用于方法内部请求调用,请求报错时难以调试,所以可以为RestTemplate加拦截器进行调试,具体操作如下: 拦截器LoggingClientHttpRequestInte ...