Docker入门笔记

Docker笔记之上手

Docker是什么

Docker是基于Go语言实现的开源容器项目,属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。

Docker解决什么

软件开发最大的麻烦事之一,就是环境配置,软件要能运行,用户必须保证两件事:操作系统的设置,各种库和组件的安装。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。总体来说,有了 Docker,就不用担心环境问题。

Docker可以做什么

Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Hello Docker

安装

Docker支持Windows、macOS、Linux等系统,本人使用树莓派Ubuntu安装Docker

官方链接:Ubuntu armhf版 安装Docker
对着这个文档step by step,直到Hello world!

root@ubuntu:/home/ubuntu# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4ee5c797bcd7: Pull complete
Status: Downloaded newer image for hello-world:latest

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.
    (arm32v7)
 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.

这段log清楚的说明了当我们运行docker run hello-world命令的时候,Docker 做了什么。

  1. 本地查找‘hello-world’镜像,本地找不到;
  2. 从Docker hub拉取‘hello-word’的最新镜像;
  3. 创建新容器运行‘hello-world’镜像。

当你看到命令行输出‘Hello from Docker!’说明Docker已经安装好了,并且网络通信等功能都是好的。

Docker 架构

Docker使用client-server架构,
Docker daemon是一个守护进程,作为server,提供一套REST API,Docker client通过socker或网络接口与daemon通信。所以client和daemon可以运行在本地同一台机器,也可以daemon在远程服务器,client可以与多个daemon通信。
Docker Registry是镜像仓库,比如官方提供的Docker Hub就是最大的公开仓库。

Docker官方架构图
Docker镜像是一个只读的模板,包含创建一个Docker容器的指令,通常镜像都是在其他镜像上面加上自定义的内容,例如在ubuntu镜像上添加一个网络服务以及配置文件。可以从仓库下载,也可以自己打包,打包的镜像也可以发布到公开仓库供他人使用,也可以建私有仓库。

Docker容器,类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
Docker VS VM
Docker与VM的区别

打包镜像

下载官方的学习例子源码,解压,进到工程项目路径下

curl -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip
unzip master.zip
cd node-bulletin-board-master/bulletin-board-app

看一下Dockerfile的内容

FROM node:current-slim

WORKDIR /usr/src/app
COPY package.json .
RUN npm install

EXPOSE 8080
CMD [ "npm", "start" ]

COPY . .

Dockerfile指定的操作如下:

  1. 以node:current-slim作为基础镜像(parent image)
  2. 指定working directory为/usr/src/app
  3. 将同目录下的package.json文件拷贝到镜像的当前目录,即/usr/src/app
  4. 运行npm install命令,会读取package.json,安装里面指定的包
  5. 容器监听8080端口
  6. 镜像内执行命令npm start
  7. 拷贝同目录下的文件拷贝到镜像的当前目录,即/usr/src/app

打包镜像:Usage: docker build [OPTIONS] PATH | URL | -

docker build --tag bulletinboard:1.0 .

-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

如果运行成功,就可以看到新生成的镜像了,image:bulletinboard

root@ubuntu:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bulletinboard       1.0                 6212224c2ab8        21 minutes ago      163MB
node                current-slim        b16bc4fd60ff        2 weeks ago         146MB
hello-world         latest              851163c78e4a        6 months ago        4.85kB

运行镜像bulletinboard:

root@ubuntu:~# docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
1b8ed80e77a6534da8a4f13603a3324faccddcb9d942698def4e52f0cb37edb8
root@ubuntu:~# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
1b8ed80e77a6        bulletinboard:1.0   "docker-entrypoint.s…"   About a minute ago   Up About a minute           0.0.0.0:8000->8080/tcp   bb
29f8e4e0656d        hello-world         "/hello"                 41 minutes ago       Exited (0) 41 minutes ago                            sleepy_kirch
68c2a398d5fd        hello-world         "/hello"                 46 hours ago         Exited (0) 46 hours ago                              ecstatic_edison

这个命令两个参数

  1. –publish,让Docker监听主机了8000端口,转送到容器的8080端口,前面Dockerfile里写了让容器监听8080端口。
  2. –detach 后台运行容器
  3. –name 给容器指定一个名字

浏览器访问树莓派的8000端口看看

停止运行这个容器

docker stop bb

删除这个容器

docker rm bb

先停止,再删除,否则就要加–force参数

发布镜像

把镜像发布到Docker hub

  1. 注册登录
  2. 创建仓库
  3. 命令行登录
  4. push
root@ubuntu:~# docker login -u <Dockerhub ID> -p <password>

root@ubuntu:~# docker tag bulletinboard:1.0 <Dockerhub ID>/bulletinboard:1.0

root@ubuntu:~# docker push <Dockerhub ID>/bulletinboard:1.0

push成功后,可以在docker hub上查看镜像,页面上可以看到pull的命令,另一台电脑可以用pull命令拉取这个共享的镜像

root@macos:~# docker pull <Dockerhub ID>/bulletinboard:1.0

此时,你也可能像我遇到pull不下来的情况,报错TLS连接不上之类的。因为docker hub的服务器远在海的那一头,所以要用个国内的镜像,如阿里云的:容器镜像加速器

学习参考

Docker 官方文档 【推荐】
Docker命令
Docker一个月入门到放弃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值