概览 | |
---|---|
阅读人群 | 后端,运维 |
本文字数 | 约等于 1718 字 |
阅读时间 | 约等于 10 分钟 |
涉及知识 | docker,Linux,shell |
先回答两个问题:
docker 是什么?
- Docker 是一种开源的容器化平台,它可以让开发者把应用程序和它们的依赖项打包到一个独立的容器中,从而实现快速的构建、部署、移植和运行。Docker 提供了一个轻量级的虚拟化环境,可以在不同的主机或操作系统上运行相同的容器,使得应用程序的部署和复杂性管理更加便捷和高效。Docker 可以用于构建和部署 Web 应用程序、数据库管理系统、消息队列、大数据处理、DevOps 工具等各种应用场景。
docker 的优势是什么?
- 轻量级和高效性:Docker 容器非常轻量级、快速、灵活和高效,可以在不同的操作系统之间移动。
- 高度可移植:Docker 容器可以在云、物理服务器、虚拟机、笔记本电脑等各种环境中运行,大大提高了应用程序的可移植性。
- 环境一致性:Docker 容器可以确保应用程序在不同的环境中运行时具有相同的设置和依赖项。
- 快速部署:Docker 容器可以快速部署,并且可以自动化构建和部署应用程序。
- 资源隔离:Docker 容器可以提供应用程序的完全隔离,可以避免应用程序之间的干扰并提高安全和可靠性。
- 可扩展性和弹性:Docker 容器可以通过容器编排工具(如 Kubernetes)进行快速扩展和弹性。
- 开发效率: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