使用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一下:
也可以完成设置
- 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"]
-
数据管理
数据卷(Volumes):数据卷是一个可供容器使用的特殊目录,它可以绕过联合文件系统,提供了一种在容器和宿主机之间共享数据的方式。数据卷可以在容器创建时指定,并且可以在多个容器之间共享。例如,可以使用docker run -v /host/path:/container/path ubuntu:latest将宿主机的/host/path目录挂载到容器的/container/path目录。
容器数据持久化:通过数据卷,即使容器被删除,数据卷中的数据也不会丢失,从而实现了容器数据的持久化。这对于保存应用程序的配置文件、数据库数据等非常重要。
-
网络配置与进阶使用
容器网络模式: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.