docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台,它可以让开发者将应用程序及其依赖打包到一个容器中,然后在任何环境中运行这个容器,实现了应用的跨平台性和一致性。

1. Docker 架构

仓库富含镜像,镜像中包含运行一个容器所需的所有文件系统,容器是镜像的运行实例,镜像是容器的基础,对一个镜像可以创建多个容器.

仓库

仓库(Repository):用于存储镜像的地方,可以分为公共仓库和私有仓库。公共仓库如 Docker Hub,提供了大量的官方和社区镜像,供用户下载和使用。私有仓库则用于企业或个人在内部网络中存储和管理自己的镜像。

镜像

镜像(Image):镜像可以看作是一个只读的模板,它包含了运行一个容器所需的所有文件系统内容,包括操作系统、应用程序、库和配置文件等。镜像是创建容器的基础。

容器

容器(Container):容器是镜像的运行实例。可以将其理解为一个轻量级的、独立的运行环境,其中包含了应用程序及其所有依赖项,容器之间相互隔离,互不影响。

2. 基本操作

安装docker

Windows

下载:访问 Docker 官方网站,选择适合 Windows 系统的 Docker Desktop 版本进行下载。www.docker.com

安装:运行下载好的安装包,按照安装向导完成安装。安装完成后,启动 Docker Desktop。

验证:在命令提示符或 PowerShell 中输入 docker --version,若显示 Docker 版本信息,则说明安装成功。

Linux系统

更新软件包索引:在终端中运行

bash 复制代码
sudo apt-get update

安装必要的包:运行

bash 复制代码
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

添加Docker官方GPG密钥:运行

bash 复制代码
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

添加Docker仓库:运行

bash 复制代码
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

再次更新软件包索引:运行

bash 复制代码
sudo apt-get update

安装Docker CE:运行

bash 复制代码
sudo apt-get install docker-ce

验证:运行 sudo docker --version,若显示 Docker 版本信息,则说明安装成功。

查看docker的版本

bash 复制代码
sudo docker --version

镜像操作

搜索镜像

bash 复制代码
docker search [镜像名称]

如docker search nginx,可以搜索 Docker Hub 上的镜像

拉取镜像

bash 复制代码
sudo docker pull [镜像名称]

如 docker pull nginx。docker pull ubuntu:latest会从 Docker Hub 上拉取最新的 Ubuntu 镜像。

测试拉取一个最简单的镜像,镜像源为docker.m.daocloud.io,镜像名为hello-world

bash 复制代码
sudo docker pull docker.m.daocloud.io/hello-world
bash 复制代码
sudo docker pull ubuntu:latest

查看镜像:通过docker images命令可以列出本地已有的镜像,显示镜像的名称、标签、ID、创建时间和大小等信息。

bash 复制代码
sudo docker images

删除镜像:用docker rmi命令删除本地镜像。例如,docker rmi ubuntu:latest将删除指定的 Ubuntu 镜像。如果镜像正在被容器使用,则需要先停止相关容器才能删除镜像。

bash 复制代码
docker rmi [镜像ID]

容器操作

创建并启动容器:运行 docker run [选项] [镜像名称],如 docker run -d -p 80:80 nginx,其中 -d 表示后台运行,-p 用于端口映射

bash 复制代码
docker run [选项] [镜像名称]

docker run -it ubuntu:latest /bin/bash会基于 Ubuntu 镜像创建一个容器,并以交互模式进入容器的 bash shell。其中,-i表示保持标准输入流打开,-t表示分配一个伪终端。

查看容器:运行 docker ps 查看正在运行的容器,使用 docker ps -a 查看所有容器

bash 复制代码
sudo docker ps -a 

docker ps命令用于查看正在运行的容器,若要查看所有容器(包括已停止的),可使用docker ps -a。该命令会显示容器的 ID、名称、镜像、状态、运行时间等信息。

bash 复制代码
docker stop [容器ID] 
bash 复制代码
docker start [容器ID]

停止和启动容器:docker stop命令用于停止正在运行的容器,例如docker stop 8d8f81da12b5。要重新启动已停止的容器,可使用docker start container_id。

bash 复制代码
docker rm [容器ID]

删除所有容器: sudo docker rm -f $(sudo docker ps -aq)

停止所有容器sudo docker stop $(sudo docker ps -q)

删除所有镜像:sudo docker rmi $(sudo docker images)

删除容器:使用docker rm命令删除容器。例如,docker rm container_id,但容器必须先停止才能被删除。若要强制删除正在运行的容器,可以使用docker rm -f container_id。

bash 复制代码
docker exec -it [容器ID] /bin/bash

进入容器:当容器在运行时,可以使用docker exec命令进入容器。例如,docker exec -it container_id /bin/bash可以进入指定容器并打开一个 bash 终端。

停止容器使用 docker stop,删除容器使用 docker rm,删除镜像使用 docker rmi

查看容器日志:使用 docker logs [容器ID] 查看容器的日志信息

构建镜像:通过 docker build -t [镜像名称] . 命令可以根据 Dockerfile 构建镜像

推送镜像:运行 docker push [镜像名称] 将本地镜像推送到 Docker Hub

常见问题

linux环境下更换docker源

先修改docker的daemon.json文件

bash 复制代码
sudo gedit /etc/docker/daemon.json

加入源

bash 复制代码
    "registry-mirrors": [
   "https://docker.m.daocloud.io",
   "https://docker.imgdb.de",
   "https://docker-0.unsee.tech",
   "https://docker.hlmirror.com",
   "https://cjie.eu.org"
    ]

重启docker服务

bash 复制代码
sudo systemctl daemon-reload 
bash 复制代码
 sudo systemctl restart docker

docker配置代理

如果docker镜像创建的过程中需要配置网络,可以直接添加本地的配置:

bash 复制代码
sudo gedit /etc/docker/daemon.json
bash 复制代码
{
    "registry-mirrors": [
   "https://docker.m.daocloud.io",
   "https://docker.imgdb.de",
   "https://docker-0.unsee.tech",
   "https://docker.hlmirror.com",
   "https://cjie.eu.org"
    ],
    "proxies": {
    "http-proxy": "http://127.0.0.1:7890",
    "https-proxy": "http://127.0.0.1:7890"
  }
}

重启docker服务

bash 复制代码
sudo systemctl daemon-reload 
bash 复制代码
 sudo systemctl restart docker

这样就能正常访问github了

windows环境下更换docker源

打开docker-desktop客户端

设置一下docker engine:

添加源:

bash 复制代码
    "registry-mirrors": [
   "https://docker.m.daocloud.io",
   "https://docker.imgdb.de",
   "https://docker-0.unsee.tech",
   "https://docker.hlmirror.com",
   "https://cjie.eu.org"
    ]

应用保存即可

当然也可以直接修改docker的daemon.json文件:

以本机使用 Administrator 账户为例,配置文件位于 C:\Users\Administrator.docker\目录下的daemon.json

打开daemon.json文件,添加源地址即可.

然后去reset一下:

也可以完成设置

  1. Dockerfile
    Dockerfile 是一个文本文件,用于定义如何构建镜像。它包含了一系列的指令,描述了镜像的基础环境、安装的软件包、配置信息以及容器启动时要执行的命令等。通过编写 Dockerfile,可以方便地创建自定义镜像,并且能够保证镜像的可重复性和一致性。例如,以下是一个简单的 Dockerfile 示例:
bash 复制代码
# 使用官方的Python镜像作为基础镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到容器的/app目录下
COPY. /app

# 安装项目所需的依赖
RUN pip install -r requirements.txt

# 设置容器启动时要执行的命令
CMD ["python", "app.py"]
  1. 数据管理

    数据卷(Volumes):数据卷是一个可供容器使用的特殊目录,它可以绕过联合文件系统,提供了一种在容器和宿主机之间共享数据的方式。数据卷可以在容器创建时指定,并且可以在多个容器之间共享。例如,可以使用docker run -v /host/path:/container/path ubuntu:latest将宿主机的/host/path目录挂载到容器的/container/path目录。

    容器数据持久化:通过数据卷,即使容器被删除,数据卷中的数据也不会丢失,从而实现了容器数据的持久化。这对于保存应用程序的配置文件、数据库数据等非常重要。

  2. 网络配置与进阶使用

    容器网络模式:Docker 支持多种网络模式,如桥接模式(默认)、主机模式、none 模式等。在桥接模式下,容器会连接到一个虚拟的网桥,通过网桥与宿主机和其他容器进行通信。主机模式则让容器直接使用宿主机的网络,容器的网络配置与宿主机相同。none 模式下,容器没有网络配置,需要用户自行配置网络。

    容器间通信:可以通过网络别名或 IP 地址在同一网络中的容器之间进行通信。例如,在一个 Docker 网络中,容器 A 可以通过容器 B 的网络别名或 IP 地址访问容器 B 提供的服务。

    Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。你可以使用 YAML 文件来配置应用程序的服务、网络和卷,然后通过一个命令来启动整个应用程序。

    Docker Swarm 是 Docker 的原生集群工具,可以将多个 Docker 主机组合成一个单一的虚拟 Docker 主机,从而实现容器的编排和管理

举一个例子来使用docker

首先要有一个Dockerfile:

bash 复制代码
FROM ros:melodic-ros-core

SHELL ["/bin/bash", "-c"]

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y curl git python-pip && \
    pip install -U --no-cache-dir supervisor supervisor_twiddler rosdep && \
    rosdep init && \
    apt-get clean

# OSRF distribution is better for gazebo
RUN sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' && \
    curl -L http://packages.osrfoundation.org/gazebo.key | apt-key add -

# RUN apt-get update && \

RUN set -eux; \
for i in $(seq 1 5); do \
    if apt-get update; then \
        break; \
    else \
        echo "Error: apt-get failed (attempt $i of 5). Retrying..." >&2; \
        sleep 1; \
    fi; \
done; \
if [ "$i" = 5 ]; then \
    echo "Error: apt-get failed after 5 attempts." >&2; \
    exit 1; \
fi

RUN set -eux; \
for i in $(seq 1 5); do \
    if apt-get install -y ros-melodic-gazebo-plugins ros-melodic-xacro ros-melodic-controller-manager ros-melodic-robot-state-publisher; then \
        break; \
    else \
        echo "Error: apt-get failed (attempt $i of 5). Retrying..." >&2; \
        sleep 1; \
    fi; \
done; \
if [ "$i" = 5 ]; then \
    echo "Error: apt-get failed after 5 attempts." >&2; \
    exit 1; \
fi

RUN git clone --depth 1 https://github.com/osrf/gazebo_models.git /tmp/gazebo_models && \
    cp -r /tmp/gazebo_models/cafe_table /usr/share/gazebo-9/models/ && \
    cp -r /tmp/gazebo_models/first_2015_trash_can /usr/share/gazebo-9/models/ && \
    cp -r /tmp/gazebo_models/mailbox /usr/share/gazebo-9/models/ && \
    cp -r /tmp/gazebo_models/table_marble /usr/share/gazebo-9/models/ && \
    rm -r /tmp/gazebo_models

RUN mkdir /src

ADD src /src

RUN source /opt/ros/melodic/setup.bash && \
    mkdir -p ~/catkin_ws/src && cd ~/catkin_ws/src && \
    catkin_init_workspace && \
    git clone --depth 1 -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git && \
    git clone --depth 1 -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git && \
    cp -r /src . && \
    cd .. && \
    rosdep update && rosdep install --from-paths src --ignore-src -r -y && \
    catkin_make -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/ros/melodic install && \
    apt-get clean && rm -r ~/catkin_ws

ADD supervisord.conf /etc/supervisor/supervisord.conf

VOLUME /opt/ros/melodic/share/turtlebot3_description

RUN echo "export ROBOT_HOST=hiwonder LIDAR_TYPE=G4" >> /opt/ros/$ROS_DISTRO/setup.bash

CMD ["/usr/local/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]

一个supervisord.conf:

bash 复制代码
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[inet_http_server]
port = :9001

[supervisord]
nodaemon=true

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[rpcinterface:twiddler]
supervisor.rpcinterface_factory = supervisor_twiddler.rpcinterface:make_twiddler_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[program:simulator]
# command=/ros_entrypoint.sh roslaunch turtlebot3_gazebo turtlebot3_autorace.launch
command=/ros_entrypoint.sh roslaunch hiwonder_gazebo worlds.launch
# environment=TURTLEBOT3_MODEL=burger
autostart=true
autorestart=true
stopwaitsecs=30
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

有了dockerfile过后就可以创建docker镜像

bash 复制代码
sudo docker build -f Dockerfile -t devrt/simulator-robot:latest .

以当前目录下的 Dockerfile 为基础,使用当前目录作为构建上下文,构建一个名为 devrt/simulator-robot 且标签为 latest 的 Docker 镜像。构建过程中,Docker 会根据 Dockerfile 中的指令执行一系列操作,如安装软件包、复制文件、设置环境变量等,最终生成一个可运行的镜像。

之前创建过,所以直接创建好了镜像了

接下来就需要创建容器了,比如sudo docker run devrt/simulator-robot:latest ,或者后台持续运行sudo docker run -d devrt/simulator-robot:latest等等,但是我们希望的是创建多个容器,所以运行的是

bash 复制代码
sudo docker compose up

对应的docker-compose.yaml为

bash 复制代码
version: '2.3'
services:
  xserver:
    image: devrt/xserver
    ipc: host
    security_opt:
    - seccomp:unconfined
    ports:
    - "3000:80"
    healthcheck:
      test: ["CMD-SHELL", "test -e /tmp/.X11-unix/X0"]
      interval: "1s"
      retries: 20
  simulator:
    image: devrt/simulator-robot
    ipc: host
    security_opt:
    - seccomp:unconfined
    environment:
    - DISPLAY=:0
    - GAZEBO_MODEL_PATH=/home/developer/models:$GAZEBO_MODEL_PATH  # Add models to Gazebo path
    volumes_from:
    - xserver
    volumes:
      - ./ros/models:/home/developer/models:rw  # Mount local models folder to simulator
      - ./ros/worlds/turtlebot3_autorace.world:/opt/ros/melodic/share/turtlebot3_gazebo/worlds/turtlebot3_autorace.world:ro  # Replace the world file
    depends_on:
    - xserver
  workspace:
    # env_file:
    #   - .env
    image: devrt/ros-devcontainer-vscode:noetic-desktop
    ipc: host
    security_opt:
    - seccomp:unconfined
    ports:
    - "3001:3000"
    - "3002:8888"
    volumes:
    - workspace:/workspace
    - .src:/workspace/src:rw  # Mount local src to /workspace in container
    environment:
    - DISPLAY=:0
    - ROS_MASTER_URI=http://simulator:11311/
    volumes_from:
    - xserver
    - simulator
    depends_on:
    - xserver
volumes:
  workspace:

services 部分定义了在 Docker Compose 中要运行的各个服务,每个服务对应一个或多个容器。

所以相当于他会自动去拉取其他镜像比如devrt/xserver:

这里当然是创建了三个容器,有些镜像会自动从hub上进行下载

以上测试文件请下载相关绑定的资源

下一次来看如何打包一个docker.

相关推荐
Leinwin3 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382503 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇3 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7593 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣4 小时前
智能体选型实战指南
运维·人工智能
yy55274 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ5 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔7 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密7 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20157 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑