Docker技术实践——初级篇

简介:     这是一篇关于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教程官方

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1537 108
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2800 10
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
673 99
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
912 2
|
Kubernetes Cloud Native 持续交付
Docker:轻量级容器化技术解析
Docker:轻量级容器化技术解析
|
运维 测试技术 Docker
Docker:轻量级容器化技术革命
Docker:轻量级容器化技术革命
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
678 16
|
存储 虚拟化 Docker
|
开发工具 虚拟化 git
自学软硬件第755 docker容器虚拟化技术youtube视频下载工具
docker容器虚拟化技术有什么用?怎么使用?TubeTube 项目使用youtube视频下载工具
|
消息中间件 Linux 数据中心
Docker核心技术:Docker原理之Namespace
通过以上内容,您可以深入了解Docker中的Namespace机制及其在资源隔离中的应用,从而更好地理解和应用Docker技术。
770 25