Published on

ubuntu下docker的安装与使用

Authors
  • avatar
    Name
    Lif
    Twitter

添加apt的存储库

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
sudo mkdir -m 0755 -p /etc/apt/keyrings
# 下载证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg


# 使用 echo 命令输出一个包含 Docker APT 源信息的字符串。
# 使用 dpkg 命令获取当前系统的架构信息,并将其插入到源信息字符串中。
# 使用 lsb_release 命令获取当前系统的发行版代号,并将其插入到源信息字符串中。
# 使用 tee 命令将源信息字符串写入到 /etc/apt/sources.list.d/docker.list 文件中,该文件将被 apt-get 命令用于更新 Docker 软件包。
# 使用重定向符号 > 将 tee 命令的输出重定向到 /dev/null,以便禁止在控制台上显示源信息字符串。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装docker engine

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

文件目录

在ubuntu下docker的文件目录通常是/var/lib/docker 但是这个目录只有root才能进去,需要转换成root权限

sudo su -
cd /var/lib/docker

/var 是 Linux 系统中的一个目录,用于存储在系统运行过程中经常变化的文件。其中包括:

  • 日志文件:例如 /var/log 目录下保存了系统和应用程序的日志文件。

  • 缓存文件:例如 /var/cache 目录下保存了安装软件时下载的缓存文件。

  • 运行时数据:例如 /var/run 目录下保存了一些系统服务和进程运行时的状态信息。

  • 邮件:例如 /var/mail 目录下保存了本地用户的邮件。

  • 打印任务:例如 /var/spool 目录下保存了打印任务。

总之,/var 目录用于存储那些需要动态修改、增长或删除的数据。与之相对,/etc 目录则用于存储静态配置文件,/usr 目录则用于存储只读数据和应用程序。

其中/var/lib/docker/container文件夹用来存放container,Docker

启动关闭

以mysql为例子

docker run -itd --name -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 mysql
# 启动一个mysql
# -p 3306:3306 使主机的3306映射到容器的3306 可以通过主机上的Mysql访问Mysql
# 每次docker run之后会生成一个容器,并且保存所有设定参数,这些参数很难修改,第二次直接start即可

关闭

docket stop mysql

启动

docker start mysql

开机启动

可以将docker container制作成服务,让他随系统启动而启动

sudo su -
cd /etc/systemed/system
touch docker-container.service
vim docker-container.service

添加如下

[Unit]
Description=Docker Container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/bin/bash -c "/usr/bin/docker start mysql1 && /usr/bin/docker start -a mysql2"
ExecStop=/bin/bash -c "/usr/bin/docker start -t 2 mysql1 && /usr/bin/docker start -t 2 mysql2"

[Install]
WantedBy=multi-user.target
# 这里启动的是两个容器/多个容器如果是一个可以改为
###########################################
# ExecStart=/usr/bin/docker start -a mysql
# ExecStop=/usr/bin/docker stop -t 2 mysql

容器内部设置

如果容器是一个ubuntu系统

可以通过docker exec -it image_name bash的方式进入容器进行一些操作

如果有需要在容器启动的时候一起启动的程序,可以在容器内部配置

vim /root/.bashrc

在其中加入

# startup run
if [ -f /root/startup_run.sh ]; then
      ./root/startup_run.sh
fi
touch /root/startup_run.sh
vim /root/startup_run.sh

可以在这个文件里面添加需要执行的命令

# 比如我的容器里有一个jupyter notebook
#可以使用
nohup jupyter notebook --allow-root >> /root/jupyter.log 2>&1 &

这样设置完后,每次启动容器,都会启动一个jupyter notebook

容器的物理位置

docker run之后会生成一个容器,位于/var/lib/docker/containers文件夹中,但是这里面的文件夹名称很奇怪 在这里插入图片描述 都是这种,这其实是一个容器的Id

需要使用docker inspect查看容器id

docker inspect container_name | grep 'Id'
# 在这里 grep是一个命令行搜索程序,可以搜索后边的参数,
# | 字符称为管道符号,它用于将一个命令的输出重定向到另一个命令作为输入,是一种最基础的管道

在这里插入图片描述 这样我们就可以通过`Id进入到容器目录, 、

容器修改

目录下的文件夹是这样的,可以对这些文件进性一些需要的修改,可以达到修改容器的效果 在这里插入图片描述

也可以使用

docker container update 

来做一些修改,但限制很多

还有一种比较不容易出问题的方法,就是将容器封装回镜像,然后重新docker run的时候添加参数

docker stop container_name
docker commit container_name new_name
docker run ......
# 在这里配置具体参数
# 比如端口 名称等