Ubuntu16.04+

在Ubuntu系统中安装较为简单,官方提供了脚本供我们进行安装。

sudo apt install curl
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE 的Edge版本安装在系统中。

启动Docker CE

sudo systemctl enable docker
sudo systemctl start docker

建立docker 用户组

默认情况下,docker 命令会使用Unix socket 与Docker 引擎通讯。而只有root 用户和docker 组的用户才可以访问Docker 引擎的Unix socket。出于安全考虑,一般Ubuntu系统上不会直接使用root 用户。因此,更好地做法是将需要使用docker 的用户加入docker用户组。

注销当前用户,重新登录Ubuntu,输入docker info,此时可以直接出现信息。

配置国内镜像加速

在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}

重新启动服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

IV. Docker的C/S模式

Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端 
接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息;Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker 守护进程交互。我们之前在Win10的命令行中便是最主要的客户端:

Docker也为我们提供了Remote API来操作Docker的守护进程,也意味着我们可以通过自己的程序来控制Docker的运行。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信:

至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:

unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
完整的Docker的C/S连接方式的本质可以一般表示为如下:

V. 使用Docker
容器的基本操作
启动一次操作容器:docker run IMAGE_NAME [COMMAND] [ARG…]

例如,启动一个容器输出hello world。由于刚装上Docker,没有任何镜像,所以会先下载一个最新的ubuntu18.04的docker镜像。一次操作容器在处理完操作后会立即关闭容器。

1
docker run ubuntu echo 'hello world'

启动交互式容器:docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash

-i –interactive=true | false,默认是false

-t –tty=true | false,默认是false

–name 给启动的容器自定义名称,方便后续的容器选择操作

启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续:

1
docker run -i -t ubuntu /bin/bash

查看容器:docker ps [-a] [-l]

省略 列出正在运行的容器

-a all 列出所有容器

-l latest 列出最近的容器

查看指定容器docker inspect name | id

name指代具体的容器名称,id则是容器的唯一id标识。inspect命令可以详细的展示出容器的具体信息。

1
docker inspect haha

重新启动停止的容器docker start [-i] 容器名

实际使用时,没必要每次都重新启动一个新的容器,我们可以重新启动之前创建的容器,现实情况也需要我们这样使用。

1
docker start -i haha

删除停止的容器docker rm name | id

1
2
docker rm thirsty_kepler
docker rm upbeat_albattani

守护式容器

交互式容器在运行完命令退出后即停止,而实际中我们常常需要能够长时间运行,即使退出也能后台运行的容器,而守护式容器具备这一功能。守护式容器具有:

  1. 能够长期运行;
  2. 没有交互式会话;
  3. 适合于运行应用程序和服务。

以守护形式运行容器

我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式退出容器。

附加到运行中的容器

退出正在运行的容器,想要再次进入,需要使用attach命令:docker attach name | id

1
docker attach haha

启动守护式容器

启动守护式容器,可以在后台为我们执行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]

当命令在后台执行完毕,容器还是会关闭。这里防止容器立刻退出,写一个脚本循环输出“hello world”。

1
docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

查看容器日志

当守护式容器在后台运行时,我们可以利用docker的日志命令查看其输出:docker logs [-f] [-t] [–tail] IMAGE_NAME

-f –follows=true | false,默认是false,显示更新

-t –timestamps=true | false,默认是false,显示时间戳

–tail=“all” | 行数,显示最新行数的日志

查看容器内进程

对运行的容器查看其进程:docker top IMAGE_NAME

运行中容器启动新进程

Docker的理念是一个容器运行一个服务,但是往往需要对一个服务进行监控,所以也需要在已经运行服务的容器启动新的进程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]

1
docker exec -i -t hiahia /bin/bash

停止守护式容器

发送信号停止容器:docker stop 容器名

强制停止:docker kill 容器名

VI. 案例:在容器中部署静态网站

容器的端口映射

命令:run [-P] [-p]

-P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;

-p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:

  • containerPort:只指定容器的端口,宿主机端口随机映射;
  • hostPort:containerPort:同时指定容器与宿主机端口一一映射;
  • ip::containerPort:指定ip和容器的端口;
  • ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。

例如:

1
2
3
4
docker run -p 80 -i -t ubuntu /bin/bash
docker run -p 8080:80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

容器中部署Nginx服务

准备环境:

1
2
3
4
5
6
7
8
# 1. 创建映射80端口的交互式容器
docker run -p 80 --name web -i -t ubuntu /bin/bash
# 2. 更新源
apt-get update
# 3. 安装Nginx
apt-get install -y nginx
# 4. 安装Vim
apt-get install -y vim

创建静态页面:

1
2
3
mkdir -p /var/www/html
cd /var/www/html
vim index.html

修改Nginx配置文件:

1
2
3
4
# 查看Nginx安装位置
whereis nginx
# 修改配置文件
vim /etc/nginx/sites-enabled/default

运行Nginx:

1
2
3
4
# 启动nginx
nginx
# 查看进程
ps -ef

验证网站访问:

1
2
3
4
5
6
# 退出容器
Ctrl+P Ctrl+Q
# 查看容器进程
docker top web
# 查看容器端口映射情况
docker port web

通过宿主机地址加映射端口访问:

VII. 镜像基操

查看删除镜像

列出镜像:docker images [OPTIONS] [REPOSITORY]

-a,–all=false,显示所有镜像

-f,–filter=[],显示时过滤条件

–no-trunc=false,指定不使用截断的形式显示数据

-q,–quiet=false,只显示镜像的唯一id

查看镜像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]

-f,–format=“”

删除镜像:docker rmi [OPTIONS] IMAGE [IMAGE]

-f,–force=false,强制删除镜像

–no-prune=false,保留未打标签的父镜像

虚悬镜像:既没有仓库名,也没有标签,均为\

获取推送镜像

查找镜像:docker search [OPTIONS] TEAM

–automated=false,仅显示自动化构建的镜像

–no-trunc=false,不以截断的方式输出

–filter,添加过滤条件

拉取镜像:docker pull [OPTIONS] NAME [:TAG]

-a,–all-tags=false,下载所有的镜像(包含所有TAG)

推送镜像:docker push NAME [:TAG]

Docker允许上传我们自己构建的镜像,需要注册DockerHub的账户。

构建镜像

构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:

  • 通过容器构建:docker commit
  • 通过Dockerfile:docker build

使用commit命令构建镜像

命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数:-a,–author=“”,指定镜像的作者信息

​ -m,–message=“”,提交信息

​ -p,–pause=true,commit时是否暂停容器

使用Dockerfile文件构建镜像

Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:

1
2
3
4
5
6
# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER wgp "Kingdompin@163.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

命令:docker build [OPTIONS] DockerFile_PATH | URL | -

参数:–force-rm=false

​ –no-cache=false

​ –pull=false

​ -q,quite=false,构建时不输出信息

​ –rm=true

​ -t,tag=“”,指定输出的镜像名称信息

VIII. 镜像迁移
我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。

上传Docker Hub
首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。

在终端中登录你的Docker Hub账户,输入docker login,输入用户名密码即可登录成功。

查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。

1
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

其中existing-image代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]则是为上传更改的标签名,tag不指定则为latest。  

可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push命令直接上传镜像。

1
docker push <hub-user>/<repo-name>:<tag>

如图,我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。  

导出文件互传

Docker 还提供了 docker load 和 docker save 命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。

查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。

Docker的使用的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. 一个Java程序猿眼中的前后端分离以及Vue.js入门

    松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的,把 Vue.js 官网的资料从头到尾浏览一遍该懂的基本就懂了,个人感觉这个是最好的 Vue.js 学习资料 ...

  2. Android快速开发常用知识点系列目录

    项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...

  3. requests使用“proxy”代理访问接口

    在requests中使用proxy代理访问 使用前先更新requests版本为支持socks的版本.   先pip安装对应库:  >> pip install -U requests[so ...

  4. 带你找到五一最省的旅游路线【dijkstra算法推导详解】

    前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己 ...

  5. POLARDB · 最佳实践 · POLARDB不得不知道的秘密

    ## 前言 POLARDB作为阿里云下一代关系型云数据库,自去年9月份公测以来,收到了不少客户的重点关注,今年5月份商业化后,许多大客户开始陆续迁移业务到POLARDB上,但是由于POLARDB的很多 ...

  6. 【Java】广州三本秋招经历

    前言 只有光头才能变强 离上次发文章已经快两个月时间了,最近一直忙着秋招的事.今天是2018年10月22日,对于互联网行业来说,秋招就基本结束了.我这边的流程也走完了(不再笔试/面试了),所以来写写我 ...

  7. DSAPI 网页获取本地程序登陆用户

    这是一个非常简单的示例,在网页或其他平台获取程序中已经登陆的用户,当然也可以是其他信息. 源码 Imports DSAPI.网络.HTTP监听_DSWebAPI Public Class Form1 ...

  8. Java面向接口编程,低耦合高内聚的设计哲学

    接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...

  9. 土旦:关于display:flex碰上white-space nowrap 影响布局的问题

    背景,做一个前面图片宽度固定,后面宽度自适应,使用到了flex布局,但是想让后面div里文字不换行,超出以点点表示时,这时布局就乱了,查了下,原来flex布局与white-space:nowrap有影 ...

  10. SQL Server存储过程邮件发送以表格方式发送

    一.收到邮件显示:示例 二.存储过程代码部分: BEGIN SET NOCOUNT ON; --初始化 Declare @MailTo nvarchar(max) Declare @MailCc nv ...