docker 基本概念和常用操作

72 阅读5分钟
概览
阅读人群后端,运维
本文字数约等于 1718 字
阅读时间约等于 10 分钟
涉及知识docker,Linux,shell

先回答两个问题:

docker 是什么?

  • Docker 是一种开源的容器化平台,它可以让开发者把应用程序和它们的依赖项打包到一个独立的容器中,从而实现快速的构建、部署、移植和运行。Docker 提供了一个轻量级的虚拟化环境,可以在不同的主机或操作系统上运行相同的容器,使得应用程序的部署和复杂性管理更加便捷和高效。Docker 可以用于构建和部署 Web 应用程序、数据库管理系统、消息队列、大数据处理、DevOps 工具等各种应用场景。

docker 的优势是什么?

  1. 轻量级和高效性:Docker 容器非常轻量级、快速、灵活和高效,可以在不同的操作系统之间移动。
  2. 高度可移植:Docker 容器可以在云、物理服务器、虚拟机、笔记本电脑等各种环境中运行,大大提高了应用程序的可移植性。
  3. 环境一致性:Docker 容器可以确保应用程序在不同的环境中运行时具有相同的设置和依赖项。
  4. 快速部署:Docker 容器可以快速部署,并且可以自动化构建和部署应用程序。
  5. 资源隔离:Docker 容器可以提供应用程序的完全隔离,可以避免应用程序之间的干扰并提高安全和可靠性。
  6. 可扩展性和弹性:Docker 容器可以通过容器编排工具(如 Kubernetes)进行快速扩展和弹性。
  7. 开发效率:Docker 容器可以让开发人员更轻松地构建、测试、部署和管理应用程序,从而提高开发效率。

docker 的原理

Docker 是一种虚拟化技术,它使用操作系统级容器来打包、分发和执行应用程序。Docker 的原理和架构包括以下几个组件:

1.  Docker Engine:Docker 引擎是 Docker 的核心组件,它负责管理容器、镜像、网络等资源。Docker Engine 包括底层的 containerd 和 runc 两个组件,以及 Docker Daemon 进程。
2.  Docker Daemon:Docker Daemon 是运行在宿主机上的后台服务进程,负责处理 Docker 命令和请求,并通过使用 containerd 和 runc 管理容器和镜像。
3.  Docker Client:Docker Client 是 Docker 命令行工具,用于与 Docker Daemon 进行交互,可以启动、停止、重启容器、构建镜像等操作。
4.  Docker Registry:Docker Registry 是 Docker 的镜像仓库,类似于 Git 的仓库。Docker 镜像可以上传到 Registry 中,其他用户可以从 Registry 拉取镜像来创建容器。
5.  Docker Container:Docker Container 是 Docker 应用程序的运行实例,它是由 Docker 镜像创建出来的。Docker 容器有自己的文件系统、网络配置、进程空间等,可以独立运行应用程序。
6.  Docker Image:Docker Image 是一个轻量级的可执行软件包,包含应用程序运行所需的全部组件和依赖关系。Docker 镜像可以使用 Dockerfile 来定义和构建。

总体而言,Docker 的架构是一个基于客户机-服务器模型的系统,客户端通过 Docker 命令行工具与 Docker Daemon 进行交互,Docker Daemon 负责管理容器、镜像和其他资源。Docker 镜像可以上传到 Docker Registry 中,其他用户可以从 Registry 拉取镜像来创建容器。

docker 的基本操作

docker 的基本操作
docker search从docker中央仓库搜索docker的所有可用镜像
docker pull从中央仓库拉取docker的镜像
docker images查看docker的镜像
docker ps -a查看docker的所有容器
docker run创建一个新的dcoker容器
docker stop停止docker容器
docker start启动docker容器
docker restart重新启动docker容器
docker logs -f查看docker容器的日志
docker rm删除docker容器
docker rmi删除docker镜像
docker cp在docker容器和宿主机之间拷贝文件
docker exec在docker容器中执行命令

docker 的进阶操作

docker 的进阶操作
docker commit container_id image_name:tag将一个docker容器变为docker镜像
docker save -o xxx.tar xxx备份docker的镜像
docker load -i xxx.tar导入docker的镜像
docker tag设置docker的镜像的名称
docker log [要登录的私有仓库地址]登录 docker hub
docker logout退出 docker hub
docker push 仓库名/镜像名将docker的镜像推送到远程仓库
docker build -t name .使用当前路径的 Dockfile 文件创建自己的镜像

docker 实战

二进制安装 docker

参考附录脚本

使用 docker 创建基于springboot的java程序运行容器

编写 springboot java程序

  • 配置文件
server:
  port: 9977

spring:
  application:
    name: demo

  redis:
    port: 6379
    password: admin123
    host: 192.168.93.13

编写 Dockfile 文件

FROM openjdk:8-jdk-slim
LABEL author=zarek
COPY target/*.jar /app.jar


ENTRYPOINT ["java","-jar","/app.jar"]

编译 docker 镜像,并运行

# 编译 docker 镜像
docker build -t javaProject1:v1.0 -f Dockerfile .

# 运行 docker 容器
docker run -d -p 9977:9977 --name=javademo1 javaProject1:v1.0

# 查看 docker 日志
docker logs -f javademo1

待完善

附录

docker安装包下载地址

二进制安装步骤地址:

二进制包下载地址:

docker二进制安装

附上

  • docker二进制安装脚本 dockerInstall.sh
  • 用法: sh dockerInstall.sh /home/[二进制docker包的全路径]

#!/bin/bash
main(){

  dockerName="$2"

  if [[ -z "$dockerName" ]];then
        echo "please add docker install package ,eg: sh docker_install.sh xxx.tgz"
        exit 1
  fi

  echo "install docker start "
  mkdir temp
  tar zxvf "${dockerName}" -C temp
        \cp temp/docker/* /usr/bin
        rm -rf temp
  source /etc/profile


cat>/etc/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target



EOF

  sudo systemctl daemon-reload
  sudo systemctl restart docker
  echo "install docker success"



}


remove(){

    pgrep -f dockerd | xargs kill -9
    rm -rf /mnt/docker
    rm -rf /etc/systemd/system/docker.service.d/http-proxy.conf
    rm -rf /etc/system/systemd/docker.service

  rm -rf /usr/bin/docker
  rm -rf /usr/bin/docker-containerd
  rm -rf /usr/bin/docker-containerd-ctr
  rm -rf /usr/bin/docker-containerd-shim
  rm -rf /usr/bin/dockerd
  rm -rf /usr/bin/docker-init
  rm -rf /usr/bin/docker-proxy
  rm -rf /usr/bin/docker-runc
  rm -rf /etc/docker

}

install_proxy(){
  echo "install net proxy start"
  mkdir -p /etc/systemd/system/docker.service.d
#cat>/etc/systemd/system/docker.service.d/http-proxy.conf<<EOF
#[Service]
#Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xx"
#Environment="HTTPS_PROXY=https://xxx.xxx.xxx.xxx:xx"
#Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
#EOF

  echo "install net proxy success"

  echo "change docker mirror start"
  mkdir -p /etc/docker
cat>/etc/docker/daemon.json<<EOF
{
    "registry-mirrors" : [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com",
    "https://cr.console.aliyun.com/"
  ]
}

EOF

  systemctl daemon-reload
  systemctl restart docker
  echo "change docker mirror success"

}

case "$1" in
        ""|" "|"install")
                main "$@"
                install_proxy
                RETVAL=$?
        ;;
        "remove")
                remove
                RETVAL=$?
        ;;
        "proxy")
                install_proxy
                RETVAL=$?
        ;;
        *)
                echo "usage: $0 {install|remove}"
        ;;


esac

exit $RETVAL