Docker 探秘

简介: 深入浅出Docker

What is Docker?

Docker is the world’s leading software containerization platform.

What is a Container?

A standardized unit of software,Package software into standardized units for development, shipment and deployment.

Containers isolate software from its surroundings, for example differences between development and staging environments and help reduce conflicts between teams running different software on the same infrastructure.

  • LIGHTWEIGHT

Docker containers running on a single machine share that machine's operating system kernel; they start instantly and use less compute and RAM. Images are constructed from filesystem layers and share common files. This minimizes disk usage and image downloads are much faster.

  • STANDARD

Docker containers are based on open standards and run on all major Linux distributions, Microsoft Windows, and on any infrastructure including VMs, bare-metal and in the cloud.

  • SECURE

Docker containers isolate applications from one another and from the underlying infrastructure. Docker provides the strongest default isolation to limit app issues to a single container instead of the entire machine.
Container

What is a Container image ?

A container image is a lightweight, stand-alone, executable package of a piece of software that includes everything needed to run it: code, runtime, system tools, system libraries, settings. Available for both Linux and Windows based apps, containerized software will always run the same, regardless of the environment.

What is a Repository?

Docker Image Hub

Docker Installations

Install Docker Community Edition (CE) For MAC

$docker -v
$docker info
$sudo usermod -aG docker your_username
$newgrp docker

镜像加速

加速配置指引:https://cr.console.aliyun.com/#/accelerator
专用加速地址:https://registry.docker-cn.com/
如果有阿里云账号,可以使用专属的加速地址

Docker实战

Docker基础命令

$docker run hello-world
$docker run -d -p 80:80 --name webserver nginx
$docker run --name web -v /source/:/web -it ubuntu:14.04 /bin/bash
$docker run --rm --name vol -v /source/:/target:ro -it ubuntu:14.04 /bin/bash
$docker run -t -i -d --volumes-from vol --name test1 ubuntu:14.04 /bin/bash

Docker Arc

docker run - 运行一个容器

-t - 分配一个(伪)tty (link is external)
-i - 交互模式 (so we can interact with it)
-d - 后台模式
ubuntu:14.04 - 使用 ubuntu 基础镜像 14.04
/bin/bash - 运行命令 bash shell
-v /host:/container
-p hostPort:containerPort
--volumes-from=containerId
--link :alias选项指定链接到的容器。

Docker 常用命令

$docker images
$docker search image_id
$docker pull image_id
$docker create -it fedora bash
$docker start container_id
$docker stop container_id
$docker restart container_id
$docker inspect container_id
$docker ps -a
$docker ps -l
$docker top
$docker kill container_id

Docker 深入探秘

交互式创建镜像

$docker run -it --name test ubuntu bash
$docker attach [容器ID|容器名称]
$docker exec -it [容器ID|容器名称] /bin/bash
$xxx blabla ...
$docker differ [容器ID|容器名称]
$docker commit -a "yangdy@" -m "my ubuntu" a404c6c174a2  myubuntu:1.0 
$docker hisotry image_id
$docker cp [容器ID|容器名称]:/container_path to_host_path

网络映射 host

$docker run -d    --name db training/postgres
$docker run -d -P --name web --link db:db training/webapp python app.py

端口映射

docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>

$docker run -p 127.0.0.1:80:8080 <image> <cmd>

Docker自动化构建

自动化构建(基于Dockerfile)

  • 构建指令
$docker build -t tag .
$docker build --build-arg APP_NAME=appName --pull -f /home/admin/Dockerfile -t reg.docker.alibaba-inc.com/home/admin/appName/APP-META/docker-config
$docker push reg.docker.alibaba-inc.com/publish
  • 最简洁的构建文件,只添加应用包
# 用基础镜像地址替换下方镜像地址
FROM reg.docker.alibaba-inc.com/namespace/imageId:version

# 将构建出的主包复制到指定镜像目录中
COPY $APP_NAME.tgz /home/admin/${APP_NAME}/target/${APP_NAME}.tgz
  • 基础镜像
# 基于基础镜像
FROM reg.docker.alibaba-inc.com/namespace/imageId:version

# 备注
MAINTAINER yangdy@aliyun.com

# 定义参数
ARG xxx_version=1.0.0
# 定义基础镜像类型
ENV docker_type="xxx:1.8.0"

#这里,用docker的RUN命令,把需要软件,使用linux的rpm命令安装,以及初始化各种环境配置

RUN rpm -ivh --nodeps "http://rpmHost/xxx1.rpm" && \
rpm -ivh --nodeps "http://rpmHost/xxx2.rpm"

RUN wget -c "http://server/source.tgz" -O /home/admin/target.tgz

## 安装 xxx 脚本
RUN curl -sLk http://server/install.sh | sh


# 将应用启动脚本和nginx配置复制到镜像中
COPY templates/app/bin/ /home/admin/app/bin/
COPY templates/cai/ /home/admin/cai/
COPY templates/start.sh /home/admin/start.sh
COPY templates/stop.sh /home/admin/stop.sh

# 设置文件夹操作权限
RUN mkdir /home/admin/logs /home/admin/output /home/admin/diamond /home/admin/cai/logs && \
chmod -R a+x /home/admin/app/bin/ /home/admin/*.sh && \
chown -R admin:admin /home/admin/*

# 挂载数据卷,指定目录挂载到宿主机上面,为了能够保存(持久化)数据以及共享容器间的数据,为了实现数据共享,例如日志文件共享到宿主机或容器间共享数据.
VOLUME /home/admin/logs \
       /home/admin/output \
       /home/admin/cai/logs \
       
# 容器启动时自动执行的脚本,我们一般会将应用启动脚本放在这里,相当于系统自启应用
ENTRYPOINT ["/home/admin/start.sh"]

# 将Aone build的APP_NAME传进来
ONBUILD ARG APP_NAME
ONBUILD ENV APP_NAME=$APP_NAME
ONBUILD WORKDIR /home/admin/${APP_NAME}/bin

start.sh文件内容

#!/bin/bash
source /home/admin/entrypoint.sh

rm -f /home/admin/start.sh.code

/home/admin/xxx_app/bin/appctl.sh restart
code=$?
echo $code > /home/admin/start.sh.code
exit $code

镜像历史,发生了什么

$docker history --no-trunc imageId

阿里云镜像仓库

登录阿里云docker registry:

$ docker login -u dongyu.ydy reg.docker.alibaba-inc.com

登录registry的用户名是您的域账号,你可以在镜像管理首页点击右上角按钮修改docker login密码。

从registry中拉取镜像:

$ sudo docker pull reg.docker.alibaba-inc.com/namespace/image:version

将镜像推送到registry:

$docker tag [ImageId] reg.docker.alibaba-inc.com/public/repository:[镜像版本号]
$docker push reg.docker.alibaba-inc.com/public/repository:[镜像版本号]

其中[ImageId],[镜像版本号]请你根据自己的镜像信息进行填写。

搭建仓库

局域网搭建

docker registry是一个开源的代码仓库实现,我们可以直接拉下来在自己的本地建一个代码仓库,也可以直接用docker-hub官方的代码仓库.或者使用自己的服务空间搭建一套代码仓库。

安装本地的 docker registry

$docker run -d -p 5000:5000 registry

下载并启动一个registry容器创建本地的私有仓库服务.docker会自动去下载并安装registry
此时,我们可以将一些建好的docker放在本地registry里面

$docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

启动本地私有仓库服务。监听5000端口

提交docker镜像

docker push 127.0.0.1:5000/test

提交成功以后,可以在宿主机上查看是否成功

curl https://127.0.0.1:5000/v1/search

之后,可以到任一机器去下载了,使用

docker pull ip:5000/test 即可

公网搭建

由于是在本机搭建的,只能在局域网内使用。如果想做公开的,可以在公网上搭建一个,本人尝试在阿里云的云服务器ecs上搭建了一个。搭建的流程和上面差不多,只是需要把ip换成公网的即可。

不过需要注意的是。由于ECS默认的ubuntu版本默认内核不支持安装docker。需要升级到3.8.0-25才可以。
升级方法:

$sudo apt-get install linux-image-3.8.0-25-generic
$sudo apt-get install linux-headers-3.8.0-25-generic

再重启

shutdown -r now

More

docker help

相关文章
|
1天前
|
运维 Linux 虚拟化
Docker详解(二)——Docker技术原理与架构
Docker详解(二)——Docker技术原理与架构
11 1
|
NoSQL 关系型数据库 MySQL
【云原生 | 从零开始学Docker】九、完结篇 Docker Compose
之前在制作dockerfile的时候,流程是写完然后build然后run,这还是单个的容器,比如公司有五十个微服务,难道要打包五十个docker吗,依赖关系啥的手动操作很麻烦!这个时候使用dockercompose高效的管理,可以定义运行多个容器!
182 0
【云原生 | 从零开始学Docker】九、完结篇 Docker Compose
|
运维 程序员 Linux
Docker 系列 _ 01_ 一念缘起
人们只有在经历过诸多痛苦之后,才会相信这“缘分”的存在。
94 0
Docker 系列 _ 01_ 一念缘起
|
Docker 容器
史上最快Docker入门!(二)-Docker环境的搭建方法
1 在MAC系统上安装Docker 先从官网将 dmg 文件下载到本地 step 1 step 2 step 3 打开 注册一份免费...
1257 1
|
Docker 容器
史上最快Docker入门!(一)-容器技术和Docker简介
1 容器技术概述 聊聊容器技术
1263 0