Docker初探

概念和基本使用

Posted by Gavin on September 26, 2019

四十年来家国

三千里地山河

概念

云计算与Docker

云计算即是通过网络将虚拟化的资源作为服务提供,通常有IaaS(基础设施即服务)SaaS(软件即服务)PaaS(平台即服务三种。云计算具有用户机不需要相应的IT环境,只需通过网络接入的特性。
Docker是基于轻量级虚拟化技术的容器引擎,基于Go语言,可以在容器内部快速自动化部署应用,并通过内核虚拟化技术来提供容器的资源隔离和安全保障。

Docker

  1. 特点
    • 低资源消耗
    • 快速启动
    • 应用耦合更好
    • 弹性部署
  2. 核心概念
    • Containers
      负责程序运行,包括操作系统、用户添加的文件和元数据
    • Images
      一个只读模版,用来运行Docker容器
    • Repository
      集中存放镜像文件的地方

简单使用

安装

Cent OS环境下:

#add docker ropo
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#install docker
yum install -y docker-ce

测试是否安装成功:

#start the service
sudo service docker start
#check the version of docker
docker version

部分回显如下:

Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8

配置

为了避免每次都使用特权身份,将目前的用户加入docker用户组

#add current user to docker group
sudo usermod -aG docker username
#restart the service
sudo service docker restart

使用镜像

利用docker获取一个ubuntu镜像:

sudo docker pull ubuntu

使用该镜像:

docker run -it ubuntu bash

回显如下:

root@9502a3831d43:/# ll
total 72
drwxr-xr-x.  1 root root 4096 Sep 26 10:28 ./
drwxr-xr-x.  1 root root 4096 Sep 26 10:28 ../
-rwxr-xr-x.  1 root root    0 Sep 26 10:28 .dockerenv*
drwxr-xr-x.  2 root root 4096 Sep 12 20:54 bin/
drwxr-xr-x.  2 root root 4096 Apr 24  2018 boot/
drwxr-xr-x.  5 root root  360 Sep 26 10:28 dev/
drwxr-xr-x.  1 root root 4096 Sep 26 10:28 etc/
drwxr-xr-x.  2 root root 4096 Apr 24  2018 home/
drwxr-xr-x.  8 root root 4096 May 23  2017 lib/
drwxr-xr-x.  2 root root 4096 Sep 12 20:53 lib64/
drwxr-xr-x.  2 root root 4096 Sep 12 20:53 media/
drwxr-xr-x.  2 root root 4096 Sep 12 20:53 mnt/
drwxr-xr-x.  2 root root 4096 Sep 12 20:53 opt/
dr-xr-xr-x. 97 root root    0 Sep 26 10:28 proc/
drwx------.  2 root root 4096 Sep 12 20:54 root/
drwxr-xr-x.  1 root root 4096 Sep 18 23:20 run/
drwxr-xr-x.  1 root root 4096 Sep 18 23:20 sbin/
drwxr-xr-x.  2 root root 4096 Sep 12 20:53 srv/
dr-xr-xr-x. 13 root root    0 Sep 26 10:28 sys/
drwxrwxrwt.  2 root root 4096 Sep 12 20:54 tmp/
drwxr-xr-x.  1 root root 4096 Sep 12 20:53 usr/
drwxr-xr-x.  1 root root 4096 Sep 12 20:54 var/

查看已有镜像:

#get a list of images
docker images
#get details
docker inspect image-name
#get the history
docker history image-name
#search a image
docker search --automated -s 3 image-name

删除镜像:

docker rmi image-name

查看容器:

#check current running containers
docker ps -a

创建、存出、存入、上传镜像:

#commit new images
docker commit -m message -a authorinfo containerid name-version
#load images
docker load --input name
#save images
docker save -o name
#upload images
docker push uesr/name:version

容器操作

创建、终止容器

#create container
docker create -it ubuntu:latest
#stop container
docker stop ubuntu:latest
#start a container background
docker start -d name

数据操作

  1. 数据卷
    一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器
  2. 创建一个数据卷容器
     docker run -it -v /dbdata --name dbdata ubuntu
    
  3. 其他容器挂载
     docker run -it --volumes-from dbdata --name cn1 ubuntu
    

端口映射

  1. 随机映射
     docker run -d -P --name co2 nginx
    
  2. 指定映射
     docker run -d -p 127.0.0.1:5000:80 --name co2 nginx
    
  3. 容器互联

     #create database container
     docker run -d --name db redis
     #create a web container linking to database
     docker run -d --name web --link db:db nginx
    

Dockerfile

shell 格式: RUN <命令> ,RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式: RUN ["可执行文件", "参数1", "参数2"] 。run可以写多个,每一个指令都会建立一层,所以正确写法应该是↓
RUN buildDeps='gcc libc6-dev make' \
         && apt-get update \
         && apt-get install -y $buildDeps \
         && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
         && mkdir -p /usr/src/redis \
         && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
         && make -C /usr/src/redis \
         && make -C /usr/src/redis install \
         && rm -rf /var/lib/apt/lists/* \
         && rm redis.tar.gz \
         && rm -r /usr/src/redis \
         && apt-get purge -y --auto-remove $buildDeps

示例:

FROM centos:7
MAINTAINER https://blog.51cto.com/andyxu
ENV TIME_ZOME Asia/Shanghai
ARG NV="nginx-1.14.0"

COPY nginx.conf /data/nginx/conf/
ADD $NV.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel \
        && mkdir -p /data \
        && cd /tmp/$NV \
        && ./configure --prefix=/data/nginx \
        && make -j 2 \
        && make install \
        && echo "${TIME_ZOME}" > /etc/timezone \
        && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
        && rm -rf /tmp/nginx* \
        && yum clean all \
        && yum -y remove gcc gcc-c++ make

WORKDIR /data/nginx/
EXPOSE 80
CMD ["./sbin/nginx","-g","daemon off;"]

构建:

docker build -t <path> <targetpath>