Docker:使用教程

docker 即容器

一些概念

Docker Registry

Docker 远程镜像仓库

  • DockerHub
  • DaoCloud / Aliyun

Docker Images

Docker Images 是用来创建 docker 容器的只读模版,其中包含了容器启动所需要的所有配置信息和运行程序,一次构建之后可以多次复用。

从结构上来讲,Docker Image 是分层次的,如图所示:

这样就自然出现了父镜像和基础镜像的概念,在图中,每一个上层镜像都是依赖于下一层的镜像,所以下层镜像可称为上层镜像的父镜像,而最底层的镜像是没有父镜像的,可称其为基础镜像(Base Image)。

实际场景下,一般我们自己创建的镜像都会依赖于某个 Linux 操作系统的镜像,例如 ubuntu,大多数情况下,我们可称其为基础镜像,但是我们也可以查看 ubuntu 镜像的 Dockerfile 会发现,它也是依赖于一个叫 scratch 的镜像,scratchdocker 的一个空镜像,里面只有 docker 加入的一些元数据,如果我们想要追求自己的镜像尽可能的轻量,也可以将 scratch 镜像作为我们的基础镜像来构建。

Dockerfile

Dockerfile 是用来说明如何自动构建 docker image 的指令集文件,在 Dockerfile 中编写好指令集之后,我们就可以通过 docker build 命令构建镜像,Dockerfile 文件中命令的顺序就是构建过程中执行的顺序。

以下为几个常用的指令:

1. FROM:依赖镜像

所有 Dockerfile 都必须以 FROM 命令开始,表示其依赖的镜像。

FROM image_name
2. MAINTAINER:镜像作者信息
MAINTAINER author <author_email>
3. RUN:在shell或者exec的环境下执行的命令
RUN <command>
4. ADD:将主机文件复制到容器中
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
5. CMD:指定容器启动默认执行的命令
CMD ["executable","param1","param2"]
6. EXPOSE:指定容器在运行时监听的端口
EXPOSE <port>
7. WORKDIR:指定RUNCMDENTRYPOINT 命令的工作目录
WORKDIR /path/to/workdir/in/container
8. VOLUME:授权访问从容器内到主机上的目录
VOLUME ["/data"]

关于 Dockerfile 编写有以下几点需要注意:

  • 尽量不要省略 MAINTAINER 信息。
  • EXPOSE 的端口不使用公有端口。
  • CMDENTRYPOINT 命令使用数组语法。

另外,在国内使用 docker(以 ubuntu 为例), Dockerfile 第一个执行的命令最好为(具体原因你猜):

RUN sed -i ‘s/archive.ubuntu.com/mirrors.aliyun.com/g‘ /etc/apt/sources.list     && apt-get update --fix-missing     && apt-get -y upgrade

Docker Container

Docker Container 中包含了我们的应用代码和代码执行的环境,是用来打包分发代码的单元。

构建镜像

首先要编写 Dockerfile,在文件中写入构建镜像需要的指令集,然后执行下面命令:

docker build {image_name} {/path/to/Dockerfile}

例如,我们构建一个 mysql 的镜像,先编写 Dockerfile

FROM ubuntu:14.04
MAINTAINER Tairy <[email protected]>

# Install Base.
RUN   sed -i ‘s/archive.ubuntu.com/mirrors.aliyun.com/g‘ /etc/apt/sources.list &&   apt-get update &&   apt-get -y upgrade &&   apt-get install -y build-essential &&   apt-get install -y software-properties-common &&   apt-get install -y byobu curl git htop man unzip vim wget

RUN apt-get -y install mysql-server

EXPOSE 3306

CMD ["mysqld"]

执行

docker build -t mysql ./

构建工具将先在本地查找 ubuntu:14.04 的镜像,如果有,则直接依赖使用,如果没有,将去远程的仓库中下载官方构建的 ubuntu:14.04 的镜像,当然因为一些不可描述的原因,这个下载过程成功率不大,而且非常耗时,所以我们可以做如下优化:

docker pull daocloud.io/library/ubuntu:wily-20160706

然后将 DockerfileFROM 命令修改为:

# 我注册了daocloud 账号,就使用 daocloud 的镜像,也可以选择使用阿里云的镜像。
FROM daocloud.io/library/ubuntu:wily-20160706

这样,就节省了很多的时间。

总之,在安装环境的过程中,因为某个伟大的防火墙工程,我们需要的大部分资源都没法顺利的获取到,解决办法就是将下载的源换成国内某些厂商提供的镜像源。(推荐阿里云,毕竟有钱,稳定。)

经过一段时间的自动构建,便可生成一个可用的 mysql 镜像,使用 docker images 命令查看构建好的镜像列表,输出:

REPOSITORY        TAG                 IMAGE ID            CREATED             SIZE
mysql            latest              ffe5a4341fee        1 days ago          1.009 GB

删除一个镜像,使用下面命令:

# -f 表示强制删除,慎重使用
docker rmi -f image_name

创建容器

有了基础的镜像模板之后,就可以创建容器来执行应用代码,具体用到 run 命令:

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

例如我们要创建一个运行 mysql 的容器,可以执行

docker run -d --name db1 -v `pwd`:/data:rw -p 8001:3306 mysql

这条命令将创建后台执行的 mysql 容器,里面运行一个 mysql 服务器,可以使用 docker ps 命令查看启动的容器。

  • -d 参数表示后台守护进程运行容器。
  • --name 参数表示容器的名称,可随意取。
  • -v 表示主机和容器共享文件的映射,容器的目录就是 Dockerfile 中用 VOLUME 命令定义的目录。
  • -p 表器主机和容器端口映射,容器的端口就是 Dockerfile 中用 EXPOSE 命令绑定的端口。

关于创建容器的时候的坑:

一般来说,我们会在 Dockerfile 中的最后用 CMD 命令定义容器启动之后执行的命令,但是如果我们定义的命令执行报错或者命令没有创建一个守护进程的话,docker ps 之后是看不到容器在运行的,此时可以使用 docker l ogs 命令查看容器启动的日志,进行排错。

当然,我们也可以在 run 的时候定义容器启动的命令,例如下面命令将启动一个 ubuntu 的容器,并执行 /bin/bash 程序,进入 ubuntu 的 terminal:

docker run -it ubuntu:14.04 /bin/bash

此命令成功的标志就是你会发现命令行变成了类似:

[email protected]:/# 

说明现在已经进入了 ubuntu 的容器中,可以直接在此命令行中操作 ubuntu,或者输入 exit 回车之后即可退出,退出之后再 docker ps 会发现容器也不再运行了。

一些常用命令:

  • docker ps -a 命令可以列出所有的容器,包括已经终止运行的。
  • docker rm container_name/container_id 可以删除某个容器。
  • docker start container_name/container_id 启动某个容器。
  • docker stop container_name/container_id 终止某个容器。
  • docker exec -it contaner_name /bin/bash 在容器中执行 /bin/bash,执行该命令之后将可以以交互命令行的方式操作容器,另外 /bin/bash 可以替换成任意可执行命令。

Docker compose

docker-compose 是用来创建和管理多容器应用的工具,使用 docker-compose 只需三步:

  1. 编写应用运行环境的 Dockerfile,即 image。
  2. 编写 docker-compose.yml,在 services 块下指定容器相关参数以及与其它容器的依赖关系。
  3. 执行 docker-compose up,运行应用。

一个简单的 docker-compose.yml 如下:

version: ‘2‘ # compose 版本,当前为 2
services:
  web: # web 容器
    build: . # Dockerfile 所在路径
    ports:
    - "5000:5000" # 端口映射
    volumes:
    - .:/code # 文件路径映射
    - logvolume01:/var/log
    links:
    - redis # 链接容器
  redis:
    image: redis # 定义链接容器
volumes:
  logvolume01: {}

原文地址:https://www.cnblogs.com/zhangfu/p/10336674.html

时间: 2024-10-16 01:50:34

Docker:使用教程的相关文章

Docker入门教程(一)介绍

http://dockone.io/article/101 Docker入门教程(一)介绍 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第一篇,介绍了Docker的基础概念以及Docker的安装. Docker是一个新的容器化的技术,它轻巧,且易移植,号称“build once, configure once and run anywhere(译者注:这个就不翻译了,翻译出来味道就没了)”.本文是Flux7的Docker系列教程的第一部分.请和这

Docker入门教程(二)命令

Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker系列教程的第一篇文章中,我们了解了Docker的基础知识,知道了它是如何工作以及如何安装的.在这篇文章中,我们将学习15个Docker命令,并通过实践来学习它是如何工作的. 首先,让我们通过下面的命令来检查Docker的安装是否正确: docker info  如果没有找到这条命令,则表示Docke

Docker入门教程(四)Docker Registry

Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它是Docker中的重要组件.本文通过情景演绎的方式对其进行了介绍,图文并茂,强烈推荐读者阅读. 在Docker系列教程的上一篇文章中,我们讨论了Dockerfile的重要性并提供了一系列Dockerfile的命令,使镜像的自动构建更加容易.在这篇文章中,我们将介绍Docker的一个重要组件:Dock

Docker入门教程(七)Docker API

Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和Docker Hub API. 纵观我们的Docker系列教程,我们已经讨论了很多重要的Docker组件与命令.在本文中,我们将继续深入学习Docker:剖析Docker APIs. Docker提供了很多的API以便用户使用.这些API包含四个方面: Docker Registry API Doc

Docker入门教程(五)Docker安全

Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通过阅读本文快速了解. 我们必须高度重视开源软件的安全问题,当开发者在使用Docker时,从本地构建应用程序到生产环境部署是没有任何差异的(译者注:作者的言外之意是更应该重视Docker的安全问题).当Docker被越来越多的平台使用的时候,我们需要严格保证Docker作为一个项目或者平台的安全性.

docker基础教程

body{ font-family: 微软雅黑; font-size: 11pt; line-height: 1;}html, body{ color: ; background-color: ;}h1 { font-size:1.5em; font-weight:bold;}h2 { font-size:1.4em; font-weight:bold;}h3 { font-size:1.3em; font-weight:bold;}h4 { font-size:1.2em; font-weig

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

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

Docker简明教程(以安装wget程序为例)

本文计划: 一.安装Docker(Centos) 二.注册Docker官网帐号 三.下载基础centos镜像,安装需要的软件和环境后,push到自己的repository 一.安装Docker(Centos) 在https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F 中选择自己的epel源. 接着,安装docker-io: $ sudo yum install docker-io 启动Docker dae

关于docker入门教程

简介:docker入门教程 docker入门教程翻译自docker官方网站的Docker getting started 教程,官方网站:https://docs.docker.com/linux/started/ 官方网站是一个交互的教程,在左侧是相应的说明,右侧是一个交互的终端,输入预期的目录,可以跳到下一步,大家可以参考我们的翻译,在官网上面运行相应的命令,以验证效果. 译者按:之前的交互教程在新版本的docker官网上已无法找到,但核心的概念流程没有变,仍然可以参考.(2015/9/16

Flux7 Docker 系列教程(一):Docker 简介

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第一篇 Part 1: An Introduction.  该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解.如有错误,欢迎指正. Docker,一种新的容器化技术,因为轻量级和便携化而受到广泛关注.Docker 和 Java 一样,号称"一次构建,一次配置,即可到处运行"(build once, configure once and run anywhere).本篇文