1 Docker概述

Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用。首先来看Docker的架构图:

理解其中几个概念:

  • Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build,docker pull...)和配置标识,并与Docker daemon通信
  • Images(Docker镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像
  • Containers(容器):镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象
  • Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub

2 Docker安装

CentOS7系统下安装Docker为例。Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

yum -y install docker

启动docker后台服务:

service docker start

验证是否安装成功:

[root@localhost hemi]# docker version
Client:
Version: 1.13.
API version: 1.26
Package version: <unknown>
Go version: go1.8.3
Git commit: 774336d/1.13.
Built: Wed Mar ::
OS/Arch: linux/amd64 Server:
Version: 1.13.
API version: 1.26 (minimum version 1.12)
Package version: <unknown>
Go version: go1.8.3
Git commit: 774336d/1.13.
Built: Wed Mar ::
OS/Arch: linux/amd64
Experimental: false

更详细的针对各操作系统的安装见官方文档:https://docs.docker.com/install/

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

请在该配置文件中加入(没有该文件的话,请先建一个):

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

3 Docker常用命令

3.1 镜像常用命令

1)搜索镜像

可以在Docker Hub主页上搜索镜像,可以通过docker search命令搜索,如:

docker search [OPTIONS] TERM

OPTIONS说明:

  • --automated : 只列出 automated build类型的镜像;
  • --no-trunc : 显示完整的镜像描述;
  • -s : 列出收藏数不小于指定值的镜像。
[root@localhost hemi]# docker search -s 20 tomcat
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/tomcat Apache Tomcat is... [OK]
docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Or... [OK]
docker.io docker.io/tomee Apache TomEE is ... [OK]
docker.io docker.io/davidcaste/alpine-tomcat Apache Tomcat /... [OK]

其中,

STARTS:镜像仓库收藏数

AUTOMATED:表示是否是自动构建的镜像仓库

2)下载镜像

docker pull [OPTIONS] NAME[:TAG]

OPTIONS说明:

  • -a :拉取所有 tagged 镜像
  • --disable-content-trust :忽略镜像的校验,默认开启

举个栗子

docker pull java   #从Docker Hub中下载最新版本的Java镜像
docker pull reg.itmuch.com/java: #从指定Registry中下载标签为8的Java镜像

3)列出镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:  

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests :显示镜像的摘要信息
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。

举个栗子:

列出本地镜像中REPOSITORY为ubuntu的镜像列表

[hemi@localhost ~]$ docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 0458a4468cbc weeks ago 111.7 MB
docker.io/ubuntu 15.10 9b9cb95443b5 months ago 137.2 MB

4)删除本地镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:  

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除;

3.2 容器常用命令

1)新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明(常用):

  • -d: 后台运行容器,并返回容器ID;
  • --name="nginx-lb": 为容器指定一个名称;
  • -i:以交互模式运行容器,通常与 -t 同时使用;
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -P: 随机端口映射;
  • -p: 指定端口映射,有以下四种格式
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • containerPort
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;

如:

docker run --name mynginx -d nginx:latest
#使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。 docker run -p : -v /data:/data -d nginx:latest
#使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到主机的91端口,主机的目录/data映射到容器的/data。
[hemi@localhost ~]$ docker run -it nginx:latest /bin/bash 
root@b8573233d675:/#
#使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

2)列出容器

docker ps [OPTIONS]

OPTIONS说明(常用):

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • --format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • --no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

3)停止容器

docker stop CONTAINER_ID/CONTAIN_NAME

4)强制停止容器

docker kill CONTAINER_ID/CONTAIN_NAME

5)启动已停止容器

docker start CONTAINER_ID/CONTAIN_NAME

6)重启容器

docker restart CONTAINER_ID/CONTAIN_NAME

7)进入容器

docker exec -it CONTAINER_ID bash

如:

[hemi@localhost ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
219371844a81 7f94db72116e "tomcat.sh" seconds ago Up seconds /tcp, /tcp, 0.0.0.0:->/tcp zen_kalam
[hemi@localhost ~]$ docker exec -it 219371844a81 bash
bash-4.2$

8)删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明(常用):

  • -f :通过SIGKILL信号强制删除一个运行中的容器
  • -l :移除容器间的网络连接,而非容器本身
  • -v :-v 删除与容器关联的卷

更多命令见Docker的官方文档https://docs.docker.com/edge/engine/reference/commandline/

也可以利用命令行查看,如:

docker rm --help

4 入门实战

此时浏览器访问结果如下表示正常 

再次访问浏览器如下结果,表示修改正常

但是此时如果重启容器,则之前的改动将失效。若要保存修改可以提交保存为新镜像↓

此过程还可以用Dockerfile完成

1、首先新建Dockerfile,内容如下:

2、在Dockerfile所在路径执行以下命令构建镜像,并运行:

浏览器访问


Dockerfile官方文档https://docs.docker.com/engine/reference/builder/

Dockerfile最佳实践https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

5 Docker Compose

Docker Compose用来定义和运行多应用容器。使用Docker Compose大致有3个步骤:

  • 使用Dockerfile定义应用程序环境,应标在任何地方重现该环境
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
  • 运行docker-compose up 命令,启动并运行整个应用程序

5.1 安装Compose

①通过以下命令自动下载并安装适应系统版本的Compose:

curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

②为安装脚本添加执行权限:

chmod +x /usr/local/bin/docker-compose

安装完成。可以使用以下命令测试安装结果:

ocker-compose --version

5.2 安装Compose命令补全工具

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

输入docker-compose并按下Tab键,compose就可以自动补全命令了。

5.3 入门实例

个人博客实例,含三个层,分别为nginx、ghost app、mysql

1、创建3个目录

2、进入ghost目录,创建两个文件

① Dockerfile

FROM ghost
COPY ./config.production.json /var/lib/ghost/config.production.json
EXPOSE

②config.production.json

{
"url": "http://localhost:2368/",
"server": {
"port": ,
"host": "0.0.0.0"
},
"database": {
"client": "mysql",
"connection": {
"host": "db",
"user": "ghost",
"password": "ghost",
"database": "ghost",
"port": ,
"charset": "utf8"
}
},
"mail": {
"transport": "Direct"
},
"logging": {
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/var/lib/ghost/content"
}
}

3、进入nginx目录,配置

①Dockerfile

FROM docker.io/nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

②nginx.conf

worker_processes ;
events {worker_connections ;}
http {
server {
listen ;
location / {
proxy_pass http://ghost-app:2368;
}
}
}

4、配置docker-compose.yml

在blog目录下创建docker-compose.yml文件

version: ''
networks:
ghost:
services:
ghost-app:
build: ghost
networks:
- ghost
depends_on:
- db
ports:
- "2368:2368"
nginx:
build: nginx
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
db:
image: "mysql:5.7.15"
networks:
- ghost
environment:
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes:
- $PWD/data:/var/lib/mysql
ports:
- "3306:3306"

以上即可。随后在docker-compose.yml所在目录build镜像并运行

docker-compost stop         #停止容器
docker-compose rm #删除容器
docker-compose build #重新建立
docker-compose up -d #启动运行

docker-compose命令-官方文档https://docs.docker.com/compose/reference/overview/

实用的Docker入门的更多相关文章

  1. docker入门、LXC、windows container 和 Hyper知识基础、实用情况

    虚拟机与容器 很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,VM因为隔离级别更高明显更重. linux容器主要技术特点: 文件系统隔离:每个容器都有自己的root文件系统 进程隔离:每 ...

  2. 这可能是最为详细的Docker入门吐血总结

    这可能是最为详细的Docker入门吐血总结  https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...

  3. Docker入门 第一课 --.Net Core 使用Docker全程记录

    微服务架构无疑是当前最火热的开发架构,而Docker作为微服务架构的首选工具,是我们必须要了解掌握的. 我通过一天的时间,网上查文档,了解基础概念,安装Docker,试验Docker命令,通过Dock ...

  4. Docker入门 .Net Core 使用Docker全程记录

    https://www.cnblogs.com/flame7/p/9210986.html Docker入门 第一课 --.Net Core 使用Docker全程记录   微服务架构无疑是当前最火热的 ...

  5. 这可能是最为详细的Docker入门总结

    写在前面 毕设是关于区块链的,自然就用到了docker,感觉到了docker的强大.学习源于总结,所以找了一些资料,这篇文章原作写的不错,看了好多遍哈哈. 这可能是最为详细的Docker入门总结 市面 ...

  6. 第三章 Docker 入门

    第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...

  7. Docker入门教程(九)10个镜像相关的API

    Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...

  8. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  9. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

随机推荐

  1. Entity Framework——记录执行的命令信息

    有两种方法可以记录执行的SQl语句: 使用DbContext.Database.Log属性 实现IDbCommandInterceptor接口 一 使用DbContext.Database.Log属性 ...

  2. 在Angular中利用trackBy来提升性能

    在Angular的模板中遍历一个集合(collection)的时候你会这样写: <ul> <li *ngFor="let item of collection"& ...

  3. UVA 1626 Brackets sequence 区间DP

    题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...

  4. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  5. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  6. TCP/IP三次握手四次挥手

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图所示,给出了TCP通信过程的示意图. TCP 三次握手四次挥手 主要包括三部 ...

  7. 转 Caffe学习系列(9):运行caffe自带的两个简单例子

    为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...

  8. js数据类型的判断方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  9. javascript学习笔记01--javascript的基本介绍

    javascript 的基本介绍1,是用于web开发的脚本语言①脚本语言往往不能独立使用 它需要和html等配合使用②脚本语言有自己的变量,函数 控制语句③解释性语言/编译语言 脚本语言实际是解释性语 ...

  10. Android开发中用到的第三方框架汇总

    最近上网搜索了一些框架资料,整理了以下常用框架,希望在项目中有所帮助. 1.网络请求框架 android-async-http 该网络框架的介绍文章地址:http://www.cnblogs.com/ ...