使用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系統
更新軟件包索引:在終端中運行
sudo apt-get update
安裝必要的包:運行
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加Docker官方GPG密鑰:運行
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加Docker倉庫:運行
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新軟件包索引:運行
sudo apt-get update
安裝Docker CE:運行
sudo apt-get install docker-ce
驗證:運行 sudo docker --version
,若顯示 Docker 版本信息,則說明安裝成功。
查看docker的版本
sudo docker --version
鏡像操作
搜索鏡像
docker search [鏡像名稱]
如docker search nginx,可以搜索 Docker Hub 上的鏡像
拉取鏡像
sudo docker pull [鏡像名稱]
如 docker pull nginx。docker pull ubuntu:latest
會從 Docker Hub
上拉取最新的 Ubuntu 鏡像。
測試拉取一個最簡單的鏡像,鏡像源為docker.m.daocloud.io,鏡像名為hello-world
sudo docker pull docker.m.daocloud.io/hello-world
sudo docker pull ubuntu:latest
查看鏡像:通過docker images
命令可以列出本地已有的鏡像,顯示鏡像的名稱、標簽、ID、創建時間和大小等信息。
sudo docker images
刪除鏡像:用docker rmi命令刪除本地鏡像。例如,docker rmi ubuntu:latest將刪除指定的 Ubuntu 鏡像。如果鏡像正在被容器使用,則需要先停止相關容器才能刪除鏡像。
docker rmi [鏡像ID]
容器操作
創建并啟動容器:運行 docker run [選項] [鏡像名稱],如 docker run -d -p 80:80 nginx,其中 -d 表示后臺運行,-p 用于端口映射
docker run [選項] [鏡像名稱]
docker run -it ubuntu:latest /bin/bash
會基于 Ubuntu 鏡像創建一個容器,并以交互模式進入容器的 bash shell。其中,-i表示保持標準輸入流打開,-t表示分配一個偽終端。
查看容器:運行 docker ps 查看正在運行的容器,使用 docker ps -a 查看所有容器
sudo docker ps -a
docker ps命令用于查看正在運行的容器,若要查看所有容器(包括已停止的),可使用docker ps -a。該命令會顯示容器的 ID、名稱、鏡像、狀態、運行時間等信息。
docker stop [容器ID]
docker start [容器ID]
停止和啟動容器:docker stop命令用于停止正在運行的容器,例如docker stop 8d8f81da12b5。要重新啟動已停止的容器,可使用docker start container_id。
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。
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文件
sudo gedit /etc/docker/daemon.json
加入源
"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服務
sudo systemctl daemon-reload
sudo systemctl restart docker
docker配置代理
如果docker鏡像創建的過程中需要配置網絡,可以直接添加本地的配置:
sudo gedit /etc/docker/daemon.json
{"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服務
sudo systemctl daemon-reload
sudo systemctl restart docker
這樣就能正常訪問github了
windows環境下更換docker源
打開docker-desktop客戶端
設置一下docker engine:
添加源:
"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 示例:
# 使用官方的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:
FROM ros:melodic-ros-coreSHELL ["/bin/bash", "-c"]ENV DEBIAN_FRONTEND noninteractiveRUN 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; \
fiRUN 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; \
fiRUN 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_modelsRUN mkdir /srcADD src /srcRUN 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_wsADD supervisord.conf /etc/supervisor/supervisord.confVOLUME /opt/ros/melodic/share/turtlebot3_descriptionRUN echo "export ROBOT_HOST=hiwonder LIDAR_TYPE=G4" >> /opt/ros/$ROS_DISTRO/setup.bashCMD ["/usr/local/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
一個supervisord.conf:
[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鏡像
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等等,但是我們希望的是創建多個容器,所以運行的是
sudo docker compose up
對應的docker-compose.yaml為
version: '2.3'
services:xserver:image: devrt/xserveripc: hostsecurity_opt:- seccomp:unconfinedports:- "3000:80"healthcheck:test: ["CMD-SHELL", "test -e /tmp/.X11-unix/X0"]interval: "1s"retries: 20simulator:image: devrt/simulator-robotipc: hostsecurity_opt:- seccomp:unconfinedenvironment:- DISPLAY=:0- GAZEBO_MODEL_PATH=/home/developer/models:$GAZEBO_MODEL_PATH # Add models to Gazebo pathvolumes_from:- xservervolumes:- ./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 filedepends_on:- xserverworkspace:# env_file:# - .envimage: devrt/ros-devcontainer-vscode:noetic-desktopipc: hostsecurity_opt:- seccomp:unconfinedports:- "3001:3000"- "3002:8888"volumes:- workspace:/workspace- .src:/workspace/src:rw # Mount local src to /workspace in containerenvironment:- DISPLAY=:0- ROS_MASTER_URI=http://simulator:11311/volumes_from:- xserver- simulatordepends_on:- xserver
volumes:workspace:
services 部分定義了在 Docker Compose 中要運行的各個服務,每個服務對應一個或多個容器。
所以相當于他會自動去拉取其他鏡像比如devrt/xserver:
這里當然是創建了三個容器,有些鏡像會自動從hub上進行下載
以上測試文件請下載相關綁定的資源
下一次來看如何打包一個docker.