Ubuntu 20.04 安装 docker 详解_ubuntu20.04安装docker23.0.3-程序员宅基地

技术标签: java  后端  

前言

首先登录官网观摩观摩:docker 安装

本文将详细介绍docker在Ubuntu20.04上的安装,以及docker命令的一些使用。例如一些常见的错误:

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.

步骤

1. 干净的卸载掉你系统中的 docker,不要问我为什么知道。

1)删除步骤1,官网给出的两条命令,当然为了确保你删的干净点,请看第二条

$ sudo apt-get purge docker-ce docker-ce-cli containerd.io

$ sudo rm -rf /var/lib/docker

2)摘抄于:https://blog.csdn.net/xbeethoven/article/details/107883970

1.常归删除操作
sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc

2. 删除docker其他没有没有卸载
dpkg -l | grep docker
dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P # 删除无用的相关的配置文件

3.卸载没有删除的docker相关插件(结合自己电脑的实际情况)
sudo apt-get autoremove docker-ce-*

4.删除docker的相关配置&目录
sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker

5.确定docker卸载完毕
docker --version

2.正式开始安装

2.1)跟着官网走,卸载掉你系统中较老版本的docker,不过经过上面的一波猛如虎的操作,基本到这里不会有啥残留了

$ sudo apt-get remove docker docker-engine docker.io containerd runc

2.2)安装相应的apt依赖

先更新一下
$ sudo apt-get update

安装相应的依赖
$ sudo apt-get install 
apt-transport-https 
ca-certificates 
curl 
gnupg-agent 
software-properties-common

2.3)添加 Docker 的官方 GPG 密钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

2.4)验证密钥

$ sudo apt-key fingerprint 0EBFCD88

2.5)根据你不同的系统去设置一个稳定的仓库(根据你的系统选一个哦,不要每个都搞)

1.x86_64/amd64

$ sudo add-apt-repository 

“deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”

2.armhf

$ sudo add-apt-repository 

“deb [arch=armhf] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”

3.arm64

$ sudo add-apt-repository 

“deb [arch=arm64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”

2.6)再更新一次 apt

 $ sudo apt-get update

2.7)到目录中设置daemon.json文件(值得注意的是,如果是首次安装,理论上是不会有 cd /etc/docker 这个目录滴,所以如果你真的是第一次安装, 请跳过此步骤,等你下面步骤报错之后,嘿嘿这个目录就会有了,然后从头走一遍你就会发现,这部可以用了)

可以另起一个命令窗口 Ctrl + Alt + T
$ cd /etc/docker/

查看是否有 daemon.json 文件,没有就创建
$ ls

创建 daemon.json 文件
$ touch daemon.json

编辑文件
$ sudo gedit /etc/docker/daemon.json

在弹出来的文本框中收入下面这段,保存
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

2.8)安装最新的 docker

 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

注意:这里会有两种情况----》》》》》》》》》》》》》》》》》》》

2.8.1)一波顺利滴成功安装,下面的 hello-world 也是非常滴顺利敲出来,感觉一切良好

然而运行一波重启docker命令:$sudo systemctl restart docker 发现报了下面这该死滴错误

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.

这错误出来后,就完了,重启系统之后docker再也没能启动,恭喜你!!你还是没能逃脱2.7的命运,请从这里跳到文章最上面,再来一次,记得要看2.7了,嘿嘿。

2.8.2)执行安装步骤直接报错,错误提示:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
containerd.io 已经是最新版 (1.4.3-1)。
将会同时安装下列软件:
  docker-ce-rootless-extras pigz slirp4netns
建议安装:
  aufs-tools cgroupfs-mount | cgroup-lite
下列【新】软件包将被安装:
  docker-ce docker-ce-cli docker-ce-rootless-extras pigz slirp4netns
升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 4 个软件包未被升级。
需要下载 0 B/75.2 MB 的归档。
解压缩后会消耗 321 MB 的额外空间。
您希望继续执行吗? [Y/n] Y
正在选中未选择的软件包 pigz。
(正在读取数据库 ... 系统当前共安装有 227693 个文件和目录。)
准备解压 .../archives/pigz_2.4-1_amd64.deb  ...
正在解压 pigz (2.4-1) ...
正在选中未选择的软件包 docker-ce-cli。
准备解压 .../docker-ce-cli_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce-cli (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 docker-ce。
准备解压 .../docker-ce_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 docker-ce-rootless-extras。
准备解压 .../docker-ce-rootless-extras_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce-rootless-extras (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 slirp4netns。
准备解压 .../slirp4netns_0.4.3-1_amd64.deb  ...
正在解压 slirp4netns (0.4.3-1) ...
正在设置 slirp4netns (0.4.3-1) ...
正在设置 docker-ce-cli (5:20.10.3~3-0~ubuntu-focal) ...
正在设置 pigz (2.4-1) ...
正在设置 docker-ce (5:20.10.3~3-0~ubuntu-focal) ...
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Thu 2021-02-25 15:11:03 CST; 4ms ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
    Process: 26894 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
   Main PID: 26894 (code=exited, status=1/FAILURE)
dpkg: 处理软件包 docker-ce (--configure)时出错:
 已安装 docker-ce 软件包 post-installation 脚本 子进程返回错误状态 1
dpkg: 依赖关系问题使得 docker-ce-rootless-extras 的配置工作不能继续:
 docker-ce-rootless-extras 依赖于 docker-ce;然而:
  软件包 docker-ce 尚未配置。

dpkg: 处理软件包 docker-ce-rootless-extras (--configure)时出错:
 依赖关系问题 - 仍未被配置
因为错误消息指示这是由于上一个问题导致的错误,没有写入 apport 报告。
                                                                    正在处理用于 man-db (2.9.1-1) 的触发器 ...
正在处理用于 systemd (245.4-4ubuntu3.4) 的触发器 ...
在处理时有错误发生:
 docker-ce
 docker-ce-rootless-extras
E: Sub-process /usr/bin/dpkg returned an error code (1)

恭喜你!!你依然是没能逃脱2.7的命运,请从这里跳到文章最上面,再来一次,记得要看2.7了,嘿嘿。

2.9)运行 hello-world

sudo docker run hello-world

3.后续的操作

3.1)以非 Root 用户身份执行 Docker,摘抄于:https://zhuanlan.zhihu.com/p/143156163

默认情况下,只有 root 或者 有 sudo 权限的用户可以执行 Docker 命令。
想要以非 root 用户执行 Docker 命令,你需要将你的用户添加到 Docker 用户组,该用户组在 Docker CE 软件包安装过程中被创建。想要这么做,输入:

$ sudo usermod -aG docker $USER

$USER是一个环境变量,代表当前用户名。
登出,并且重新登录,以便用户组会员信息刷新。

3.2)服务的一些命令

systemctl enable docker # 开机自动启动docker
systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer
systemctl stop docker # 关闭dokcer

3.3)docker命令大全网络摘录:查看

# 查看信息
docker info

# 查看运行中的进程
docker ps

# 查看全部
docker ps -a
docker ps -all

# 显示最后运行
docker ps -l

# 查看该容器的详细信息
docker inspect 44fc0f0582d9

# 由其该信息非常多,只截取了其中一部分进行展示。如果要显示该容器第一个进行的PID可以使用如下方式
docker inspect -f {
   {.State.Pid}} 44fc0f0582d9

使用docker exec进入Docker容器

# 使用该命令进入一个已经在运行的容器
docker ps

docker exec -it 775c7c9ee1e1 /bin/bash

# 完整版
docker exec -it 镜像ID /bin/bash
# 最小版(alpine)
docker exec -it 镜像ID sh

镜像

# 查看docker镜像
docker images

# 删除镜像
docker images rmi

# 构建一个镜像
docker build -t holiday /usr/local/docker/holiday #Re-build docker container

# 打包提交拉取
docker tag kafka-monitor:0.2 10.0.23.11:5000/kafka-monitor:0.2
docker push xxx.xxx.xxx.xxx:5000/kafka-monitor:0.1
docker pull xxx.xxx.xxx.xxx:5000/kafka-monitor:0.1

# 停止所有容器
docker ps |grep holiday |awk '{print $1}' |xargs -i docker stop {}

# 提交一个镜像
docker commit 1a442630f4a9 test/javaweb:0.0

日志

# docker日志查询
docker logs 2f2de065fd05

停止与删除

# 杀死所有正在运行的容器
docker kill $(docker ps -a -q)

# 删除所有已经停止的容器
docker rm $(docker ps -a -q)

# 删除所有未打 dangling 标签的镜像
docker rmi $(docker images -q -f dangling=true)

# 删除所有镜像
docker rmi $(docker images -q)

# 根据 IMAGE ID 来删除
docker rmi ee7cbd482336

从容器中复制文件

docker cp 371f3ff1f43b:/usr/local/bin/etcdctl /usr/local/bin/etcdctl

为这些命令创建别名

# 杀死所有正在运行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'
# 删除所有已经停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'
# 删除所有未打标签的镜像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'
# 删除所有已经停止的容器和未打标签的镜像.
alias dockerclean='dockercleanc || true && dockercleani'
另附上docker常用命令
docker version #查看版本
docker search tutorial#搜索可用docker镜像
docker pull learn/tutorial #下载镜像
docker run learn/tutorial echo "hello word"#在docker容器中运行hello world!
docker run learn/tutorial apt-get install -y ping#在容器中安装新的程序

运行

# 运行docker镜像
docker run -i -t -v /root/software/:/mnt/software/ --privileged=true index.alauda.cn/alauda/ubuntu /bin/bash

# 运行一个jenkins镜像的例子命令
    sudo docker run 
    -d -p 8088:8080 -p 50000:50000 
    -v /home/docker/jenkins_home/:/var/jenkins_home 
    -v /var/run/docker.sock:/var/run/docker.sock 
    -v $(which docker):/usr/bin/docker 
    -v $(which git):/usr/bin/git 
    -v ~/.ssh:/var/jenkins_home/.ssh 
    --name=jenkins jenkinsci/jenkins

一个完整的运行步骤

# 第一次运行
sudo docker run --name myjenkins -p 8088:8080 -p 50000:50000 -d docker.io/jenkinsci/jenkins

# 停止
docker stop  myjenkins

# 启动(是没有问题的)
docker start myjenkins

# 重新commit一个新的
docker ps -a 获取到ff2d09d0ddd8

# 提交一个成为新镜像
docker commit ff2d09d0ddd8 test/jenkins:0.2

查看docker运行容器的ip

# 第一次运行
sudo docker run --name myjenkins -p 8088:8080 -p 50000:50000 -d docker.io/jenkinsci/jenkins

# 1. 进入容器内部后
cat /etc/hosts
会显示自己以及(– link)软连接的容器IP

# 2.使用命令
docker inspect --format '{
   { .NetworkSettings.IPAddress }}' <container-ID> 
或 
docker inspect <container id> 
或 
docker inspect -f '{
   {range .NetworkSettings.Networks}}{
   {.IPAddress}}{
   {end}}' container_name_or_id

# 3. 可以考虑在 ~/.bashrc 中写一个 bash 函数:
    function docker_ip() {
        sudo docker inspect --format '{
   { .NetworkSettings.IPAddress }}' $1
    }

    source ~/.bashrc 然后:

    $ docker_ip <container-ID>
    172.11.0.6

# 4.要获取所有容器名称及其IP地址只需一个命令。
docker inspect -f '{
   {.Name}} - {
   {.NetworkSettings.IPAddress }}' $(docker ps -aq)
如果使用docker-compose命令将是:
docker inspect -f '{
   {.Name}} - {
   {range .NetworkSettings.Networks}}{
   {.IPAddress}}{
   {end}}' $(docker ps -aq)

# 5.显示所有容器IP地址:
docker inspect --format='{
   {.Name}} - {
   {range .NetworkSettings.Networks}}{
   {.IPAddress}}{
   {end}}' $(docker ps -aq)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_54853420/article/details/124464889

智能推荐

JScript 是 JavaScript 的缩写吗?_javascript的小写缩写是?-程序员宅基地

文章浏览阅读3.3k次。JScript 是 JavaScript 的缩写吗? 资策会数字教育研究所讲师 杨宏文  很多人都误以为JScript就是JavaScript的缩写,这一点是需要澄清的,让笔者先讲一段故事。 在Web Scripting language世界中第一个诞生的是,由网景公司(NetScape)所催生的JavaScript。到_javascript的小写缩写是?

iOS开发-设置启动图片LaunchImage_ios创建 launchimage-程序员宅基地

文章浏览阅读1.3k次。通常app在开启的时候都会有自己的启动图片,下面就开始设置app的启动图片。第一步:在图片资源包里创建LaunchImage。然后就创建好了LaunchImage,只不过一开始是空的,而这里我已经添加好了图片。注意:一定要按照尺寸添加全部图片,不然会报错。附上:iOS-AppIcon和LaunchImage尺寸附上仅供学习使用:配置好一部分的LaunchImage下载..._ios创建 launchimage

Mock进行单元测试_单体测试用mock吗-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏17次。中文文档参考地址,点击这里汪文君Mockito实战视频汪文君Mockito源码,点击这里@InjectMocks用来修饰被测试的类:就是对哪个类中的方法进行单元测试的时候,就用该注解修饰这个类。InjectMocks创建这个类的对象并自动标记@Mock,@Spy等注解的属性注入到这个中。要求必须是类不能是接口。使用1.Maven<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all --> &l_单体测试用mock吗

.tar.gz 跟.tgz_tgz和tar.gz-程序员宅基地

文章浏览阅读2.6k次。.tar.gz 跟.tgz 是一种格式吗?tar.gz_百度百科以.tar.gz为后缀的文件是一种压缩文件,在Linux和macOS下常见,Linux和macOS都可以直接解压使用这种压缩文件。_tgz和tar.gz

yolov3代码详细解读_yolov3代码详解-程序员宅基地

文章浏览阅读3.4k次,点赞15次,收藏73次。下文所有代码:https://pan.baidu.com/s/1p-Q-edFXXcvzxlZNd9saOw 提取码:x72s原理可以参考:yolov1-v5学习笔记及源码解读目录1 目录结构2 train.py2.1 数据读取 dataset.py2.2 网络搭建 models.py2.2.1 搭建模型2.2.2 yolo层的实现2.2.3 darknet进行模型前向传播3 test.py4 detect.py5 功能脚本5.1 utils.py:5.2 logger.py5.3 augment._yolov3代码详解

一步步制作Arduino智能小车_arduino小车-程序员宅基地

文章浏览阅读1.4w次,点赞21次,收藏285次。小白第一次实战_arduino小车

随便推点

Java购物小系统(使用最基础的语法实现的控制台购物系统)_java控制台采购系统-程序员宅基地

文章浏览阅读2.6k次。自述:本人是一名卑微专科大一软件技术学生,目前学习Java已经快三个月了吧,在这里给大家分享一下我的学习成果,希望看到的大佬可以给我一些建议,也希望这篇文章能给正在学习Java的小伙伴一些练习的途径:程序执行的入口是(InSystem.java)文件总共分为十一个Java文件 客户信息管理 添加客户信息 创建一个客户类,里面声明客户应具备的客户信息,如:客户编号、客户姓名、客户电话、客户积分等,声明该类的对象数组,利用对象数组存储客户的信息,_java控制台采购系统

Android开发 轻量缓存框架--ASimpleCache_android 轻量缓存文件-程序员宅基地

文章浏览阅读339次。做Android应用开发的同学们相信对“缓存”这个词不陌生,缓存可能有多方面的概念,这里大概列举下程序开发的缓存大概有哪些:1.服务端控制缓存如volley请求库,便是通过服务端的“Cache-Control”和“max-age”来告诉客户端有没有缓存以及缓存的时间,也是推荐的使用方式,但是需要服务端配合,比较灵活。2.客户端直接控制缓存有些时候不需要服务端来支持的_android 轻量缓存文件

《机器人动力学与控制》第七章—路径规划与避障 7.3 工作空间下使用人工势场法进行路径规划_排斥势场-程序员宅基地

文章浏览阅读1.8k次。上一节我们发现,在关节空间下,很难获得一个直白的障碍物空间QO的表达,也很难在关节空间下评估人工势场的梯度。事实上,对于一个曲面,一般来说并不存在一个描述点到曲面的闭合表达式。即便我们能够表达清楚QO,仍然很难获得关节空间下的梯度ρ。为了解决这些问题,我们将对上一节说到的人工势场法做出一点改进,使势场方程定义在工作空间 W 而不是关节空间 Q。本节我们会先讲解如何一个在工作空间里正确地描述势场,..._排斥势场

CSS学习笔记-程序员宅基地

文章浏览阅读166次,点赞2次,收藏6次。CSS学习笔记本文章是基于B站pink老师的视频和PPT,结合个人认为重点的部分以及自身模糊的知识点进行归纳。一、CSS(1)1. CSS简介CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称。有时我们也会称之为 CSS 样式表或级联样式表。CSS 是也是一种标记语言 。2. CSS基础选择器2.1 选择器分类选择器分为基础选择器和复合选择器两个大类,我们这里先讲解一下基础选择器。基础选择器是由单个选择器组成的基础选择器又包括:标签选择器、 类选

北斗卫星与GPS介绍_北斗系统能获取z轴数据了吗-程序员宅基地

文章浏览阅读3.3k次。学习过空间解析几何的同学都知道,在一个立体直角坐标系中,任何一个点的位置都可以通过三个坐标数据X、Y、Z来得到确定。也就是说,只要能得到X、Y、Z三个坐标数据,就可以确知任何一点在空间中的位置。如果能测得某一点与其它三点A、B、C的距离,并确知A、B、C三点的坐标,就可以建立起一个三元方程组,解出该未知点的坐标数据,从而得到该点的确切位置。  GPS就是根据这一原理,在太空中建立了一个由24颗_北斗系统能获取z轴数据了吗

Java word导出,可导出一份word或多页word内容_有模板的word导出 需要导出多份 一个文件 java-程序员宅基地

文章浏览阅读6.4k次。一步步按着写,图片看不清的,右键打开新标签页查看图片,谢谢htmla href="javascript:void(0)" class="easyui-linkbutton" plain="true" id="btn_customOpen">导出worda>前端js(ids为传递参数)$.messager.confirm('温馨提示','确认打印选中用户信息!',functio_有模板的word导出 需要导出多份 一个文件 java