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系統
更新軟件包索引:在終端中運行

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一下:
在這里插入圖片描述
在這里插入圖片描述
也可以完成設置

  1. Dockerfile
    Dockerfile 是一個文本文件,用于定義如何構建鏡像。它包含了一系列的指令,描述了鏡像的基礎環境、安裝的軟件包、配置信息以及容器啟動時要執行的命令等。通過編寫 Dockerfile,可以方便地創建自定義鏡像,并且能夠保證鏡像的可重復性和一致性。例如,以下是一個簡單的 Dockerfile 示例:
# 使用官方的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:

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.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73802.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73802.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt Widgets、Qt Quick

一、核心概念 ?Qt Widgets? Qt框架中的傳統桌面UI開發組件庫,基于C實現,提供按鈕、文本框等控件?。適用于需要深度集成操作系統底層功能或復雜業務邏輯的桌面應用?。 ?Qt Quick? QML的標準庫和工具包,提供預置的視覺組件(如…

LinuX---Shell正則表達式

正則表達式 正則表達式使用單個字符串來描述、匹配一系列符合某個語法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。在Linux中,grep,sed,awk等命令都支持通過正則表達式進行模式匹配…

nginx配置txt文件點擊鏈接后下載

手上有一個txt文件,上傳到文件服務器后,點擊路徑是在瀏覽器里直接打開了,用戶需要的是下載到本地 nginx新增配置 location ~* /ExcelDownload/envScript/(.\.txt) {add_header Content-Disposition "attachment; filename$1";add…

相機光學(四十七)——相紙材質

1. 光面相紙 光面相紙表面光滑,亮度高,反光性好,能夠呈現出清晰、鮮艷的圖像效果,適合用于表現色彩艷麗、反差要求較高的題材,如產品照、藝術照和風景照。然而,這種相紙容易沾上指紋和灰塵。 2. 絨面相紙…

LabVIEW 線性擬合

該 LabVIEW 程序實現了 線性擬合(Linear Fit),用于計算給定一組數據點的斜率(Slope)和截距(Intercept),并將結果可視化于 XY Graph 中。本案例適用于數據擬合、實驗數據分析、傳感器…

Swift 并發中的任務讓步(Yielding)和防抖(Debouncing)

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

【Android】RuntimeShader 應用

1 簡介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)編寫著色器代碼,底層基于 Skia 圖形渲染引擎。官方介紹詳見 → Runti…

小程序API —— 53 本地存儲

小程序本地存儲是指在小程序中使用 API 將數據存儲在用戶的設備上,以便小程序在運行時和下次啟動時快速地讀取這些數據; 小程序本地存儲的 API 可以分為兩類,每一類可以分為四種: 同步 API: 存儲:wx.setS…

el-table樹形表格合并相同的值

el-table樹形表格合并相同的值 el-table樹形表格合并相同的值讓Ai進行優化后的代碼 el-table樹形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

虛幻基礎:移動組件

文章目錄 移動組件&#xff1a;角色的移動信息和移動控制walk&#xff1a;行走falling&#xff1a;跳躍&下落 通用設置重力&#xff1a;模式通用重力max acceleration&#xff1a;模式通用加速度 walk制動降速行走&#xff1a;速度超過最大速度時的減速力 falling空氣控制空…

DeepSeek + Kimi 自動生成 PPT

可以先用deepseek生成ppt大綱&#xff0c;再把這個大綱復制到Kimi的ppt助手里&#xff1a; https://kimi.moonshot.cn/kimiplus/conpg18t7lagbbsfqksg 選擇ppt模板&#xff1a; 點擊生成ppt就制作好了。

Unity 解決TMP_Text 文字顯示異常的問題

問題 Unity 中TMP_Text 文字顯示異常大多可分為兩種情況。①制作TMP 字體選用的文本不包含該文字&#xff1b;②制作TMP 字體選用的ttf 源不包含該文字。 第一種情況&#xff0c;制作TMP 字體選用的文本不包含&#xff0c;只需在選用的Charater File 中添加再重新生成即可。 …

Day19:把數字翻譯成字符串

現有一串神秘的密文 ciphertext&#xff0c;經調查&#xff0c;密文的特點和規則如下&#xff1a; 密文由非負整數組成數字 0-25 分別對應字母 a-z 請根據上述規則將密文 ciphertext 解密為字母&#xff0c;并返回共有多少種解密結果。 LCR 165. 解密數字 - 力扣&#xff08…

CentOS下安裝ElasticSearch(日志分析)

準備目錄 搞一個自己喜歡的目錄 mkdir /usr/local/app 切換到該目錄 cd /usr/local/app 下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz 選擇其他版本 點擊進入官網

汽車機械鑰匙升級一鍵啟動的優點

汽車機械鑰匙升級一鍵啟動的優點主要包括&#xff1a; 便捷性&#xff1a;一鍵啟動功能的引入極大地提升了用車便捷性。車主無需翻找鑰匙&#xff0c;只需在車輛感應范圍內輕觸啟動鍵&#xff0c;即可輕松發動汽車。 安全性&#xff1a;移動管家專車專用一鍵啟動系統配備了防…

【深度學習量化交易16】觸發機制設置——基于miniQMT的量化交易回測系統開發實記

我是Mr.看海&#xff0c;我在嘗試用信號處理的知識積累和思考方式做量化交易&#xff0c;應用深度學習和AI實現股票自動交易&#xff0c;目的是實現財務自由~ 目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。 很多朋友關心回測系統的開發進展&#xff0c;在正式…

RabbitMQ 和 Redis 的選擇

在處理大規模消息場景時&#xff0c;RabbitMQ 和 Redis 的選擇需根據具體需求權衡。 大規模消息場景的關鍵考量 ?吞吐量需求&#xff1a; ?Redis&#xff1a;更適合 ?超高頻寫入?&#xff08;如百萬級/秒&#xff09;&#xff0c;但需犧牲部分可靠性。?RabbitMQ&#xff…

【從零開始學習計算機科學與技術】計算機網絡(七)應用層

【從零開始學習計算機科學與技術】計算機網絡(七)應用層 應用層DNS域名資源記錄域名解析:域名解析的種類:電子郵件SMTP簡單郵件傳輸協議POP3IMAP文件傳輸(FTP、TFTP和NFS)FTPTFTPNFSWWW超文本HTMLURLHTTP代理服務器:遠程登陸Telnet和rlogin多媒體通信協議應用層 其最靠…

圖解AUTOSAR_CP_WatchdogDriver

AUTOSAR WatchdogDriver模塊詳解 AUTOSAR MCAL層看門狗驅動模塊詳細解析 目錄 1. 模塊概述2. 架構位置 2.1. 組件架構 3. 主要功能4. API接口5. 配置參數 5.1. 配置模型 6. 錯誤代碼7. 狀態管理 7.1. 狀態機 8. 處理流程 8.1. 活動流程 9. 操作序列 9.1. 典型操作序列 10. 硬件…

Linux操作系統應用

Linux操作系統應用 一、用戶與用戶組管理1.1 管理用戶1.1.1 與用戶賬號相關的文件1.1.2 用戶管理命令1.1.3 任務實施 1.2 管理用戶組1.2.1 用戶組1.2.2 用戶組管理命令 1.3 查看用戶和用戶組狀態1.3.1 用戶查看命令 id、who、whoami1.3.2 用戶身份切換命令 su、sudo 二、文件管…