【Docker 入门指南】构建与运行容器的最佳实践

Docker是一种开源的容器化平台,用于开发、部署和运行应用程序。它利用操作系统级虚拟化技术将应用程序及其依赖项打包到一个称为“容器”的标准化单元中,从而实现跨环境的一致性和可移植性。

什么是Docker

Docker的主要组成部分

  1. Docker Engine
  • Docker Engine是一个C/S架构的应用,包括Docker守护进程(Daemon)和Docker CLI客户端
  • 守护进程(Docker Daemon)负责创建、运行和管理容器
  • CLI客户端允许用户通过命令行与Docker守护进程进行交互
  1. Docker镜像(Images)
  • 镜像是只读的模板,用于创建Docker容器。它们包含了运行应用程序所需的所有文件和配置
  • 用户可以从Docker Hub等镜像仓库下载现有镜像,也可以基于基础镜像创建自己的自定义镜像
  1. Docker容器(Containers)
  • 容器是镜像的运行实例。它们包含了应用程序运行所需的一切,并且可以在任何Docker环境中一致运行
  • 容器是隔离的、可移植的,并且可以在不同的操作系统上运行
  1. Docker仓库(Registry)
  • 仓库用于存储和分发Docker镜像。Docker Hub是一个公共的仓库,用户可以在上面上传和下载镜像
  • 也可以设置私有仓库来存储公司内部的镜像

Docker的优点

  1. 一致的开发和生产环境
  • 通过将应用程序及其所有依赖项打包在容器中,确保了在不同环境中的一致性。
  • 开发人员可以在本地开发和测试,随后将相同的容器部署到生产环境中,而无需担心环境差异导致的问题
  1. 资源隔离和利用
  • Docker容器相互隔离,并且使用操作系统级虚拟化,具有较低的开销和高效的资源利用率
  • 每个容器都有自己的文件系统、网络接口和资源配额,可以精细控制资源的使用。
  1. 快速启动和停止
  • Docker容器启动速度非常快,通常在秒级别。相比传统的虚拟机,Docker容器的启动和停止时间大大缩短
  1. 易于管理和编排
  • Docker提供了强大的工具链,用于管理和编排容器。例如,Docker Compose可以定义和运行多容器应用,Kubernetes等编排工具可以管理大规模容器集群
  1. 可移植性
  • Docker容器可以在任何支持Docker的平台上运行,包括开发人员的笔记本电脑、测试服务器、公有云和私有云环境

Docker的应用场景

  1. 开发和测试
  • 开发人员可以在本地创建容器化的开发环境,与生产环境保持一致
  • 容器使得测试环境的设置更加快速和一致
  1. 持续集成和持续部署(CI/CD)
  • 通过使用Docker,CI/CD管道可以更快地构建、测试和部署应用程序
  • 容器化的应用可以轻松地部署到各种环境中
  1. 微服务架构
  • Docker非常适合构建和部署微服务架构。每个微服务可以在独立的容器中运行,易于管理和扩展。
  1. 混合云和多云部署
  • Docker的可移植性使得应用可以在不同的云环境中运行,无需进行额外的修改

Docker环境部署

卸载旧版本的Docker(如果有)

sudo apt-get remove docker docker-engine docker.io containerd runc

卸载旧版本的Docker(如果有)

sudo apt-get remove docker docker-engine docker.io containerd runc

更新包索引并安装必要的依赖

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

添加Docker的官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置使用国内源,比如阿里云的Docker镜像源

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新包索引并安装Docker CE

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

启动Docker并设置为开机自启动

sudo systemctl start docker
sudo systemctl enable docker

查看Docker版本信息

sudo docker version

运行Docker

配置Docker使用国内镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
   "registry-mirrors": ["https://dockerhub.icu"]
   }
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1. 拉取Hello World镜像并运行

sudo docker pull hello-world
sudo docker run hello-world

成功运行后,你应该会看到类似以下的输出:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2. 拉取ubuntu镜像并运行

sudo docker pull ubuntu
sudo docker run -it ubuntu

3. 构建自定义镜像

  • 编写Dockerfile,比如自定义镜像中包含net-tools, iproute2 vim gcc g++工具
    # 使用官方的Ubuntu基础镜像
    FROM ubuntu:latest
    
    # 更新包列表并安装所需工具
    RUN apt-get update && \
        apt-get install -y net-tools iproute2 vim gcc g++ && \
        apt-get clean
    
    # 设置工作目录
    WORKDIR /root
    
    # 设置启动时执行的命令
    CMD ["bash"]
    
  • 构建自定义镜像
    sudo docker build -t my-ubuntu:latest .
    
    • sudo: 以超级用户权限执行命令
    • docker build: Docker 的构建命令,用于从 Dockerfile 构建镜像
    • t my-ubuntu:latest: 指定构建的镜像标签为 my-ubuntu,并且标记版本为 latest
    • .: 表示 Docker 构建的上下文路径,即 Dockerfile 所在的当前目录。Docker 在构建镜像时会使用当前目录及其子目录中的内容作为构建上下文
  • 创建并运行一个新的 Docker 容器
    sudo docker run -it --name my-ubuntu-container my-ubuntu:latest
    
    • sudo: 以超级用户权限执行命令
    • docker run: Docker 的运行命令,用于创建并启动一个新的容器
    • it: 参数 i 表示交互式操作,t 表示分配一个伪终端(pseudo-TTY),这样可以进入容器的交互式 Shell
    • -name my-ubuntu-container: 指定容器的名称为 my-ubuntu-container,这样你可以通过名称来管理和操作容器
    • my-ubuntu:latest: 指定要运行的 Docker 镜像名称为 my-ubuntu,并且标签为 latest。这是从 Docker Hub 或者本地镜像仓库中获取的镜像
    • 如果该镜像不存在本地,Docker 将会从 Docker Hub 下载该镜像

4. 构建携带ssh功能的镜像

  • 编写Dockerfile

    # 使用官方的Ubuntu基础镜像
    FROM ubuntu:latest
    
    # 更新包列表并安装必要的包,包括SSH服务器
    RUN apt-get update && \
        apt-get install -y openssh-server iputils-ping && \
        apt-get install -y net-tools iproute2 vim gcc g++ make && \
        apt-get clean
    
    # 创建目录以运行SSH服务
    RUN mkdir /var/run/sshd
    
    # 设置root密码
    RUN echo 'root:123456' | chpasswd
    
    # 允许root通过SSH登录并允许密码认证
    RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
        sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
        sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
    
    # 禁用pam登录限制
    RUN sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
    
    # 解决可能的权限问题
    RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh && chown root:root /root/.ssh
    
    # 暴露端口22
    EXPOSE 22
    
    # 启动SSH服务并保持容器运行
    CMD ["/usr/sbin/sshd", "-D"]
    
  • 构建自定义镜像

    sudo docker build -t my-ubuntu:latest .
    
  • 启动一个新的 Docker 容器

    sudo docker run -d -p 2222:22 --name ubuntu-test  my-ubuntu:latest
    
    • d:以分离模式运行容器(在后台运行)
    • p 2222:22:将主机的端口 2222 映射到容器的端口 22,这通常用于 SSH 访问容器
  • 进入已经运行的容器

    ssh root@localhost -p 2222
    


    关注我的微信公众号,获取更多精彩内容!
    ​​​​​​在这里插入图片描述

​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值