Docker技术实践——初级篇

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:     这是一篇关于Docker技术的初级文档,主要针对Docker的babies。当然,如果是老鸟也欢迎温故知新。 2.    Docker组件(C/S) Docker组件分为客户端和服务端。


    这是一篇关于Docker技术的初级文档,主要针对Docker的babies。当然,如果是老鸟也欢迎温故知新。

2.    Docker组件(C/S)

Docker组件分为客户端和服务端。

Docker Client:Docker的客户端

Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,按照相应的路由规则实现路由分发。

Docker Registry:是Docker镜像的中央存储仓库

Docker镜像运行之后变成容器。

 

3.    Docker

Docker需要使用Linux内核中的CGroups和Namespace功能,必须包含这两项功能,内核版本必须高于3.10.

3.1     安装docker

安装docker,安装docker和docker.io,使用命令

apt-get install docer

apt-get install docker.io

启动docker Daemon命令为:

#service docker start或者systemctl start docker

查看Docker版本

#docker version

运行测试(因为需要下载hello-world镜像,会自动去外网下载):

#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/engine/userguide/

或者使用网上的镜像进行测试

我们使用码云上的一个开源项目

先克隆项目命令如下:

# git clone

然后编译镜像:

# docker build -t cyphere/centos:7.1 .

Sending build context to Docker daemon 8.704 kB

Step 1 : FROM centos:centos7.1.1503

 ---> c288e5945774

Step 2 : MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

 ---> Using cache

 ---> ec1a67832870

Step 3 : ENV TZ "Asia/Shanghai"

 ---> Using cache

 ---> 577afeadeac1

Step 4 : ENV TERM xterm

 ---> Using cache

 ---> c6cb24e09d77

Step 5 : ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

 ---> Using cache

 ---> 25fef5ca6f0b

Step 6 : ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo

 ---> Using cache

 ---> 983dd35ebe92

Step 7 : RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwdsudo yum-utils hostname net-tools rsync man &&     yum install -y gcc gcc-c++ git make automakecmake patch logrotate python-devel libpng-devel libjpeg-devel &&     yum install -y --enablerepo=epel pwgenpython-pip &&     yum clean all

 ---> Using cache

 ---> 8d4ad2dbd92f

Step 8 : RUN pip install supervisor

 ---> Using cache

 ---> a112b76647f4

Step 9 : ADD supervisord.conf /etc/supervisord.conf

 ---> Using cache

 ---> 0fd05419af62

Step 10 : RUN mkdir -p /etc/supervisor.conf.d &&     mkdir -p /var/log/supervisor

 ---> Using cache

 ---> 14d11d019067

Step 11 : EXPOSE 22

 ---> Using cache

 ---> 464f20e0f9b8

Step 12 : ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisord.conf

 ---> Using cache

 ---> d31702307c6b

Successfully built d31702307c6b

 

3.2     Docker常用命令

查看镜像命令使用:

docker images

查看docker进程:

    docker ps

查看容器日志

docker logs -f <容器名orID>

删除所有容器,不可以删除一个运行中的容器,此时必须先用docker stop或docker kill命令停止它才能删除。

docker rm $(docker ps -a -q)

删除之后去查看docker ps –a发现都不存在了。

删除单个容器

docker rm <容器名orID>

停止、启动、杀死一个容器

docker stop <容器名orID>

docker start <容器名orID>  (如果全部删掉后,那先如要执行docker run <images id>来启动)

docker kill <容器名orID>

拉取镜像

docker pull <镜像名:tag>

删除所有镜像(慎重不要被好不容易下载的给删除了)

docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)

构建自己的镜像

docker build -t <镜像名> <Dockerfile路径>

如Dockerfile在当前路径:

docker build -t xx/gitlab .

保存镜像:

当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。

docker save busybox-1 > /home/save.tar

使用scp将save.tar拷到其他机器上,然后:

docker load < /home/save.tar

从容器中拷贝文件出来

docker cp 7bb0e258aefe:/etc/debian_version .

把容器转换成镜像

docker commit

调查容器详细信息,诊断问题信息常用

docker inspect

 

1.1.1   容器内执行命令

#docker exec -it <container id> /bin/bash

进入交互模式

1.1.2    Docker run参数

上面中的docker命令包括了三部分:docker,run,hello-world。

其中docker表示客户端程序,

run表示子命令。

hello-world表示镜像名称。

说白了,docker run 组合在一起代表运行一个新docker容器。

我们继续运行一个ubuntu镜像:

#docker pull Ubuntu

然后运行一个含shell终端的容器:

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

直接进入到docker容器镜像了。

复杂一点的例如如下

运行一个新容器,同时为它命名、端口映射、文件夹映射。

docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine

一个容器连接到另一个容器

docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server sonar

此外还可有有其他参数,例如-v参数。

在Docker run中-v参数表示映射本地文件到容器中。在数据库相关的容器中很有用,其他需要保存数据文件的场景也可以使用。

语法如下:

-vhost_dir:container_dir

--rm参数表示容器

--entrypoint可以覆盖掉原先的ENTRYPOINT参数,--entrypoint=/bin/bash

 

1.1.3   Docker create命令

通过create命令将镜像生成容器,但是不运行。

 

4.    Docker的镜像和容器

容器和镜像是Docker的核心部分,Docker实际就是在容器里面运行一个镜像。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。

镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。

Docker容器可以使用命令创建:

# docker run imagename

会在所有的镜像层之上增加一个可写层。这个可写层运行在CPU上的进程,有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。

当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此相互隔离的。对其中一个容器所做的变更只会局限于那个容器本身。

如果对容器的底层镜像进行修改,当前正在运行的容器是不受影响的,不会发生自动更新现象。

如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则可能会导致损失容器中所有数据的后果。

64字符的十六进制的字符串来定义容器ID,是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。

4.1 Dockfile 

dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

Dockfile是创建Docker的文件,可以理解成makefile。

VOLUME 映射本地文件给虚拟机,

CMD参数: container启动时执行的命令,一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。

ENTRYPOINT 容器入口进程,最后一个生效。container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条,ENTRYPOINT没有CMD的可替换特性。

ADD,将文件<src>拷贝到container的文件系统对应的路径<dest>

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0,如果文件是可识别的压缩格式,则docker会帮忙解压缩。如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下。

和Dockerfile同目录的.dockerignore文件可以记录文件名字用于忽略,即忽略文件中哪个文件。

ONBUILD命令在未做其他基线的时候引用触发,ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

编译生成镜像,命令如下:

     docker build -t csphere/centos:7.1 .

其中-t参数指定镜像名称和tag

    不过如果依赖基础镜像的话,下载速度很可能超时。

4.2     语法

FROM是基础镜像

MAINTAINER 作者

ENV 环境变量

RUN 是安装哪些服务

ADD

EXPOSE

ONBUILD ADD

ONBUILD RUN

 

4.3     第三方镜像

可以到docker镜像市场

    此处下载一个tomcat镜像。

拉取镜像,命令如下:

docker pull daocloud.io/library/tomcat:7.0-jre7-alpine

当然可以拉最新的可以使用:

docker pull daocloud.io/library/tomcat:latest

拉取完毕后可以使用 docker images来查看。

启动镜像容器:

# docker run -it -p 8080:8080 daocloud.io/library/tomcat

    也可以使用其他国内的镜像市场。

    其中-p是指定主机和容器的端口映射。

 

4.1     容器的网络

可以使用如下命令进行查看:

#docker network ls

查看网络详情

#docker network inspect bridge

创建新的桥接网络

#docker network create –driver bridge mynet

 

4.2     容器的数据

容器的文件系统由分层文件系统提供,包含只读层(镜像)和可读写层(容器运行时)。如果要将主机上文件系统共享给容器使用,可以使用数据卷或者数据容器。

       数据卷是将主机的卷mount进入到容器,数据容器是将外部容器分享给容器。使用参数-v。例如:

#docker run -d -v /webapp xxx

#docker run -d -v /root:/hostroot xxx

第二个命令是将/root目录映射到了容器中的/hostroot中。第一个命令创建一个数据卷。

       因为容器本身可以包含文件系统,可以把容器的卷分享给另一个容器。可以先创建一个包含外部卷的容器,然后使用--volumes-from来指定该数据容器。

       需要注意的是,数据卷在容器创建时进行初始化,数据卷可以共享也可以容器间重用,其读写是直接下发的。

 

5.   关于Docker 仓库

镜像的公共仓库是Docker Hub,在海外,国内的需要墙出去才可以。当然可以在公司内部建立私有仓库,或者在网上建立公共的私有仓库。主要命令就是:search,pull,login,push。

例如查找mysql镜像,执行:

#docker search mysql

6.   参考

Docker教程官方

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 数据库 Docker
OBCP实践 - OceanBase Docker 体验
开发者和技术爱好者可以在无需复杂安装配置的情况下迅速搭建OceanBase数据库环境,从而方便地进行功能测试、性能评估或者开发调试等实践活动。同时,由于Docker的便捷性,此方法也支持跨平台部署,使得OceanBase数据库能够在不同的操作系统(如Linux、Windows、macOS)上轻松体验。
74 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
2月前
|
运维 云计算 Docker
深入理解与实践:基于Docker的微服务架构优化策略
本文旨在为软件开发和运维人员提供一个全面的指南,探讨如何通过Docker容器技术优化微服务架构。我们不仅深入分析了Docker在微服务环境中的关键作用,还提出了一系列实践策略,以提高部署效率、增强系统稳定性,并确保服务的可伸缩性和安全性。通过具体案例分析和比较传统部署方式的局限性,本文展示了Docker如何成为微服务架构优化不可或缺的工具,旨在帮助读者构建一个更加灵活、高效和可靠的服务环境。
149 1
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
72 0
|
2月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
301 2
|
2月前
|
虚拟化 开发者 Docker
深入浅出:利用Docker容器化技术加速Web开发流程
在本篇文章中,我们将探讨Docker容器化技术如何为Web开发带来革命性的效率提升。通过具体案例和实操示范,我们不仅会介绍Docker的基本概念和工作原理,还将深入分析如何利用Docker容器化技术简化开发环境的搭建、提高应用的可移植性以及加快部署速度。本文旨在为读者提供一种全新的视角,理解并实践如何通过Docker优化现代Web开发流程,无论是对于个人开发者还是团队项目,都将带来前所未有的便捷和效率。
29 0
|
2月前
|
负载均衡 开发者 Docker
深入浅出:利用Docker容器化技术提升Web开发效率
在快速变化的软件开发领域,开发者面临着环境一致性和项目部署效率的双重挑战。Docker作为一种先进的容器化技术,为解决这些问题提供了优雅的解决方案。本文将探讨Docker的核心概念、优势以及如何在Web开发中应用Docker来提升开发和部署的效率。通过实际案例分析,读者将了解到如何构建、分享和运行Docker容器,以确保开发环境的一致性,并加速Web应用的交付过程。
|
3月前
|
Linux Docker Python
Python实战技术 - Python虚拟隔离环境 和 Docker技术
Python实战技术 - Python虚拟隔离环境 和 Docker技术
197 0
|
3月前
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
48 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)