1.首先明白两个个概念:容器docker,镜像image。
镜像我们可能已经熟悉,制作系统盘时,我们都会把系统制作成一个镜像,然后再放到U盘中制作成系统启动的U盘,这里我们则是把自己写好的代码制作成一个镜像,然后通过几步操作将这个镜像放在指定的容器中运行,在这个容器中,相关的配置都是为了该镜像能够运行,并且这些配置都是独立于我们的计算机的环境。
2. Docker hub
一个存放了诸多开源的镜像的资源网,我们可以轻松的下载下来直接在容器中运行。
网址:https://www.docker.com/products/docker-hub
3.docker中常用的命令可以参考这个博客 https://blog.csdn.net/Chenftli/article/details/91412352
可以通过在终端登陆自己的docker hub 命令为:
docker login 用户名 -p 密码
可以在终端中查找docker hub中的镜像 命令:
docker search 镜像名字
查找到我们需要的镜像时 下载镜像 命令:
docker pull 镜像名
下载的镜像我在本地是无法查看源码的,如果需要修改源码,需要运行装载此镜像的docker,在此docker中查看,如我下载的autoware镜像可以在该容器中查看
如果我们需要将代码制作成镜像,我们可以在当前目录下创建一个镜像 命令 :
docker build --tag 镜像名字:版本 点
如果我们需要修改代码,并且再次生成一个镜像也可以用 命令(具体的参数可以参考一下链接)
docker build --tag 镜像名字:版本 点
https://www.runoob.com/docker/docker-build-command.html
我们通过docker build 创建的镜像会储存在本地,启动一个docker,我们只要通过命令(具体的参数可以参考一下链接)
docker run --detach --name bb 镜像名:版本号
https://www.runoob.com/docker/docker-run-command.html
其中--detach 表示该容器在后台运行, --name 给这个容器起一个别名,方便以后的操作。
当我们需要关闭一个容器时可以docker stop 容器名/别名
如果我们要把自己制作的镜像上传至docker hub ,首先登陆自己的docker hub 账号,点击Repositories, 再点击create ,给自己的镜像起一个dicker hub名字,点击create,再回到终端,指定需要上传的镜像和目标目录,命令:
docker tag bulletinboard:1.0 704252630/jctest:1.0
将生成的镜像传至docker hub 命令
docker push 704252630/jctest
2.docker 制作镜像
- 编写DockerFile文件
- docker build
- docker run
DockerFile是用来构建Docker镜像的构建文件,由一系列的命令参数构成的脚本,它描述了怎么样为容器构建一个私有的文件系统,和怎么样基于镜像去运行一个容器。当吗命令行输入docker build 时会系统自动根据DockerFile文件去生成镜像。
写一个DockerFile文件是为一个镜像构建容器的第一步骤。DockerFile文件包含以下几项必要的内容
FROM:指定基础镜像
MAINTAINER:镜像维护者姓名及邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露的端口号
WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中<src原路径>的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY ["src", "dest"]
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令
注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
CMD指令的格式和RUN相似,也是两种格式:
shell格式:CMD <命令>
exec格式:CMD [“可执行文件”, “参数1”, “参数2” …]
参数列表格式:CMD [“参数1”, “参数2”, …],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。
官网案例:
# Use the official image as a parent image.
FROM node:current-slim
# Set the working directory.
WORKDIR /usr/src/app
# Copy the file from your host to your current location.
COPY package.json .
# Run the command inside your image filesystem.
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .
autoware DockerFile
ARG FROM_ARG
# hadolint ignore=DL3006
FROM ${FROM_ARG}
ARG ROS_DISTRO
ARG VERSION
ENV USERNAME autoware
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Build Autoware
RUN bash -c 'mkdir -p /home/$USERNAME/Autoware/src; \
cd /home/$USERNAME/Autoware; \
wget https://gitlab.com/autowarefoundation/autoware.ai/autoware/raw/$VERSION/autoware.ai.repos; \
vcs import src < autoware.ai.repos; \
source /opt/ros/$ROS_DISTRO/setup.bash; \
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release'
RUN echo "source /home/$USERNAME/Autoware/install/local_setup.bash" >> \
/home/$USERNAME/.bashrc
COPY ./entrypoint.sh /tmp
ENTRYPOINT ["/tmp/entrypoint.sh"]
参考: