Docker基础

最近两年随着微服务而流行起来的Docker是一种轻量级容器技术(相对于VMWare,KVM等Hypervisor解决方案).

它能给开发,测试,运维各团队提供一个统一的运行环境, 这点很实用.

Docker可以看做在内核容器技术(Cgroup和Namespace)的基础上提供更高级功能的控制工具,主要特性:

(1)跨主机部署(2)以应用为中心 (3)自动构建 (4)版本管理 (5)组建重用 (6)共享 (7)工具生态链

补充: 关于虚拟化的主流分类

  • 操作系统(服务器)级别的虚拟化: 在硬件层之上做Hypervisor,内核级隔离. 常见的有VMWare vsphere, XEN,KVM, Hyper-V
  • 进程(容器)级别的虚拟化: Docker 和LXC(Linux Container)

配置国内镜像

国内使用前Docker的第一件事,必须先配置国内镜像加速器,否则下载容器镜像龟速(最近安装docker也不用了)

使用示例:

# 如果想永久保存,编辑/etc/docker/daemon.json并添加
{
  "registry-mirrors": [
    "https://dockerproxy.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ]
}
# 必须重启服务以生效
sudo service docker restart
# 检查是否生效
docker info

说明:详情可参考掘金文章

安装

Ubuntu环境安装

# 安装Docker
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 列出版本
sudo apt-cache madison docker-ce
# 指定版本
sudo apt-get -y install docker-ce=[VERSION]
sudo apt-get -y install docker-ce=5:24.0.0-1~ubuntu.22.04~jammy
# 注:docker-compose已内置并改名为 docker compose
sudo apt-get -y install docker-ce

CentOS

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker

CentOS离线安装

依赖库: libcgroup和device-mapper-*

# 离线包下载: http://rpmfind.net/linux/rpm2html/search.php
rpm -ivh clibcgroup-*
rpm -ivh device-mapper-*  --force --nodeps
# 追加一行到/etc/fstab
none /sys/fs/cgroup  cgroup  defaults    0 0

# 重启以生效
shutdown -r now

# 启动cgroup
service cgconfig start

# 下载docker: https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
rpm -ivh docker-engine-*.rpm
service docker start

非root运行docker

sudo groupadd docker  # 可选
sudo usermod -a -G docker xulz
sudo gpasswd -a xulz docker   # add to docker group
newgrp docker
docker version  # 查看效果

基础命令

  • docker
  • docker-compose : 编排
  • docker-machine (Docker Toolbox已过时,不推荐使用)
    # 把当前用户添加到docker组
    sudo usermod -aG docker xulz
    ## docker
    docker run  # 在新容器运行命令
    docker start  # 启动容器
    # 查看所有容器
    docker ps -a  
    docker ps -a --no-trunc  # 显示完整的命令
    # 查看所有镜像
    docker images
    docker stop/rm xxx
    # 删除
    docker rm <container_id>
    docker rmi <image_id>
    # 加载镜像
    docker load <  <image_file>
    # 复制文件到容器
    docker cp source_file <container_name>:destination
    # 切换到容器终端
    docker exec -it container_name /bin/bash
    
    # 在后台启动
    docker start  `docker ps -q -l` # restart it in the background
    docker attach `docker ps -q -l` # reattach the terminal & stdin
    # Detatch:  Ctrl+p + Ctrl+q


    ## 常用compose命令
    # --build 意味着在启动前先构建容器
    # -d 在detached模式运行
    docker-compose up --build
    docker-compose ps
    docker-compose stop
    
    ## docker-machine
    docker-machine ip
    docker-machine env

Docker Hub

到hub.docker.com注册自己的ID, 提供一个私有仓库及不限共有仓库.

今天为了国内访问kubernetes的学习项目方便,建立了一个镜像,步骤如下:

    # 需要先在网页创建仓库
    # 再命令行登录hub
    docker login
    docker pull gcr.io/google-samples/kubernetes-bootcamp:v1
    docker tag gcr.io/google-samples/kubernetes-bootcamp:v1 xulz/kubernetes-bootcamp:v1
    docker push xulz/kubernetes-bootcamp:v1

用Docker部署Flask Web App的示例

主要用到的配置文件:

  • Dockerfile : 存放自动化的创建镜像的全部指令> docker build
  • docker-compose.yml : 创建多个容器的模板文件,主要包含services,volumns,network
  • .env : 设置环境变量
  • .dockerignore : 忽略文件

扩展

与Vagrant比较

  • docker-compose exec CONTAINER /bin/sh == vagrant ssh
  • docker cp == vagrant scp

资源参考