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 lsdocker 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,镜像可以通过:来识别,也可以通过来识别
  • CREATED 表示这个镜像制作的时间
  • SIZE 表示这个镜像的大小
  • 列出所有虚悬镜像

docker image ls -f dangling=true

?  ~ docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  • 表示没有虚空镜像
  • 列出所有镜像,包含中间层镜像

docker image ls -adocker 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: [email protected]: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: [email protected]: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 [email protected] -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 lsdocker 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 -adocker ps --alldocker container ls -adocker 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
[email protected]:/app# pwd
/app
[email protected]:/app# ls
Dockerfile  README.md  demos  logo.png  node_modules  package-lock.json  package.json
[email protected]:/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 定义匿名卷

原文地址:https://www.cnblogs.com/xinjie-just/p/11743250.html

时间: 2024-10-17 04:05:05

docker 学习总结的相关文章

Docker 学习笔记【1】Docker 相关概念,基本操作

计划:Docker 学习笔记[2] Docker 基础操作实操记录,Docker仓库.数据卷,网络基础学习---40 注:所有操作在root下执行 --1--概念: 1.Docker镜像: 镜像就是一个只读的模板,用于创建docker容器. Docker提供了简单的机制创建或者更新现有镜像,也可以从别处拿来现成镜像直接使用. 2.Docker容器: 可以认为是精简版的linux运行环境包含 [root权限,进程空间,用户空间,网络空间等]和应用程序 另外:镜像是只读的,容器基于镜像启动后创建一层

Docker 学习笔记【2】 Docker 基础操作实,Docker仓库、数据卷,网络基础学习

Docker 学习笔记[3] Docker 仓库实操,创建私有仓库,实操数据卷.数据卷容器,实操 网络基础  ---------高级网络配置和部分实战案例学习 ============================================================= Docker 学习笔记[1]Docker 相关概念,基本操作--------实操记录开始 ============================================================= 被

Docker学习笔记(一)什么是Docker

Docker学习笔记(一)什么是Docker Docker:容器技术是虚拟化技术的一种,是操作系统的虚拟化. 传统硬件虚拟化:虚拟硬件,事先分配资源,在虚拟的硬件上安装操作系统,虚拟机启动起来以后资源就会被完全占用. 操作系统虚拟化:docker是操作系统虚拟化,借助操作系统内核特性(命名空间.cgroups)实现,不需要模拟硬件行为,不需要安装操作系统. 优点: 硬件虚拟化需要安装操作系统占用空间大. 硬件虚拟化需要模拟硬件系统行为,内存和cpu消耗更大. 缺点: 容器进程崩溃,可能影响宿主机

Docker学习笔记(四)走进docker的世界

Docker学习笔记(四)走进docker的世界 一个容器实际上是运行在宿主机上的一个进程. 只不过在启动这个进程之前进行了一些特殊处理,让这个容器进入了一个全新的虚拟环境,与宿主机的环境分开, 所以这个进程及其子进程认为自己运行在一个独立的世界里面. #查看进程 sudo docker run -d cyf:sshd /usr/sbin sshd -D ps axf 可以看到在宿主机里面的5948这个sshd进程 下面进入docker容器查看 sudo docker-enter.sh 6867

Docker学习教程笔记整合(完整)

Docker学习教程笔记整合(完整) 本文主要是整理了DockerOne组织翻译的Flux7的Docker入门教程,通过markdown记录,方便离线学习.原文地址,http://dockone.io/article/101. 文中一些链接可能会跳转国外的网站,如果没有插件或开VPN的朋友,可以尝试修改一下Hosts文件,如何修改Hosts文件.或者使用XXNet插件,如何使用XXnet 介绍 Docker是一个新的容器化的技术,它轻巧,且易移植,号称"build once, configure

docker学习笔记1 -- 安装和配置

技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔记:http://www.open-open.com/lib/view/open1423703640748.html 深入浅出docker:http://www.infoq.com/cn/articles/docker-core-technology-preview 安装 参考:http://www

docker学习(1)----基础概念

转载请注明源文章出处:http://www.cnblogs.com/lighten/p/6841677.html 1.前言 docker的官网:这里.下一段摘自官网描述. docker是世界领先的软件容器平台.开发人员使用docker可以消除与同事的代码协作时产生的"在我机器上运行是正常的"等问题.运营商使用docker在独立的容器中运行和管理应用程序,以获得更好的计算密度.企业使用docker构建灵活的软件传送通道,可以更快,更安全地运行新功能,并且对于Linux和Windows S

个人--Docker学习笔记

Docker学习笔记 docker让应用分发,测试,部署变得前所未有的高效和轻松 docker利用率很高,一台主机上可以同时运行数千个docker容器 docker容器除了运行其中应用外,基本不消耗额外的系统资源 docker容器不需要额外的hypervisor支持,是内核级的虚拟化 docker容器几乎可以在任意平台上运行 docker的三个基本概念 镜像(image) 容器(container) 仓库(repository) 以上是docker的整个生命周期 镜像的作用是用来创建容器的.镜像

docker学习笔记(2)---Dockerfile

在docker学习笔记(1)中,我们提到了通过commit 的命令来提交新的image,下面我们来通过Dockerfile文件来生成image,而且使用Dockerfile,很方便移植. 一.Dockerfile中几个常用的指令: (1)FROM 格式: FROM <image> 或者 FROM <image>:<tag> (2)MAINTAINER 格式: MAINTAINER <name> 说明:设置生成image的作者 (3)RUN 格式: 使用she

Docker学习笔记——镜像、容器、仓库

Docker三个基本概念 镜像(image) 容器(container) 仓库(Repository) 镜像(image) 搜索镜像 docker search nginx 获取镜像 docker pull nginx 指定Registry地址和具体的仓库名下载镜像,没有指定Registry地址,默认从Docker Hub上下载 docker pull jwilder/nginx-proxy 查看镜像 docker images  REPOSITORY          TAG