Docker技术实践——初级篇

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:     这是一篇关于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
目录
相关文章
|
11天前
|
Kubernetes 调度 Docker
深入探讨容器编排技术:从Docker到Kubernetes
容器编排在现代IT中日益关键,从Docker到Kubernetes,助力应用的自动化部署和扩展。Docker提供容器技术,打包应用及环境为镜像,通过引擎、镜像、容器、网络和存储组件实现隔离运行。Kubernetes作为高级容器编排平台,管理Pod(多容器集合),其核心包括API服务器、控制器管理器、调度器和Kubelet。Kubernetes集群由Master和Worker节点构成,实现Pod的高效调度和运行。
36 6
|
20天前
|
持续交付 开发者 Docker
深入了解 Docker:革命性的容器化技术
Docker,自2013年起,革新了软件开发和部署,解决了环境差异问题。这个轻量级容器技术基于Linux容器(LXC),提供应用程序隔离和环境一致性。Docker通过容器化实现快速部署、CI/CD集成和微服务架构。相比虚拟机,Docker更轻便,不需模拟完整操作系统。它简化流程,提升效率,促进了容器化技术的普及。
58 0
|
2月前
|
SQL 数据库 Docker
OBCP实践 - OceanBase Docker 体验
开发者和技术爱好者可以在无需复杂安装配置的情况下迅速搭建OceanBase数据库环境,从而方便地进行功能测试、性能评估或者开发调试等实践活动。同时,由于Docker的便捷性,此方法也支持跨平台部署,使得OceanBase数据库能够在不同的操作系统(如Linux、Windows、macOS)上轻松体验。
84 2
|
2月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
3月前
|
运维 云计算 Docker
深入理解与实践:基于Docker的微服务架构优化策略
本文旨在为软件开发和运维人员提供一个全面的指南,探讨如何通过Docker容器技术优化微服务架构。我们不仅深入分析了Docker在微服务环境中的关键作用,还提出了一系列实践策略,以提高部署效率、增强系统稳定性,并确保服务的可伸缩性和安全性。通过具体案例分析和比较传统部署方式的局限性,本文展示了Docker如何成为微服务架构优化不可或缺的工具,旨在帮助读者构建一个更加灵活、高效和可靠的服务环境。
153 1
|
4天前
|
Cloud Native Linux 开发者
【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用
【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用
|
7天前
|
弹性计算 测试技术 持续交付
Docker技术这些应用场景,你知道吗?
Docker技术这些应用场景,你知道吗?
|
12天前
|
存储 Kubernetes Docker
构建高效稳定的Docker容器集群:从原理到实践
【4月更文挑战第19天】 在当今微服务架构盛行的时代,容器化技术已经成为了软件开发和部署的标准实践。本文深入探讨了如何利用Docker容器技术,结合Kubernetes集群管理工具,构建一个高效、稳定且可扩展的容器化环境。文章首先简述了Docker的核心原理及其优势,接着详细阐述了Kubernetes的基本概念与组件,最后通过一个实际案例来指导读者如何从零开始搭建并优化一个基于Docker和Kubernetes的容器集群系统。
19 1
|
1月前
|
前端开发 Ubuntu 开发者
【Docker系列】Docker-核心概念/常用命令与项目部署实践
【4月更文挑战第1天】 Docker是容器化技术,打包应用及依赖,实现快速部署。核心概念包括镜像、容器和仓库。镜像是只读模板,容器是镜像运行实例,仓库用于存储和分发镜像。常用命令如`docker search`、`docker pull`、`docker images`、`docker ps`等。安装Docker在Ubuntu上涉及`apt-get update`、`install docker-ce`等步骤。了解这些基础,开发者能更高效地部署和管理应用。Docker简化了环境配置,增强了软件的可移植性和扩展性,是现代开发的必备技能。
285 3
|
2月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
14 0