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.

相关推荐
SelectDB18 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker