开始

这是第一个尝试在Leanote上面编写文章,我觉得最重要的事情就是能够保证md文件是能够移植的,否则如果这个软件不靠谱的话,我还能把文章移动到别的地方去。所以先写一篇文章看看效果如何,方便不方便移动。


一直听说docker很好用,但是并没有把他作为一个主力使用的工具,因为看它的命令还是很繁琐的,,,说起来,,确实是因为我没有耐心的去看它的使用方式。那么接下来就通过文字的方式简单的记忆一下docker的使用方式,以及简单的工作原理。


基本原理

实际上docker就是容器,类似于proot的存在。对于proot的文件系统来说,就是docker的镜像(image)。这个镜像可以通过docker pull的方式从镜像源拉取,类似于apt或者yum的工作方式,非常方便,当然还是需要换源的。想要知道本地有什么已经下载的镜像可以通过docker images命令查看。

把镜像运行起来之后,就称之为容器。当前有什么正在运行的容器可以通过docker ps命令查看。

容器之间都是相互独立的存在,彼此是不能相见的,这也对安全了些保障,如果是正常情况下直接在主机上面运行一个网站,那么可能会出现文件上传漏洞这样的问题,进而被控制整个主机。但是如果是通过docker来运行网站,那么就不需要担心这个问题了,数据库和网站都在容器里面,别的什么东西都没有,也是完全不用担心的。

如果想要让两个容器互相通讯,使用--link参数就可以了,方法是https://www.cnblogs.com/vincenshen/p/8724584.html

命令记录

安装

建议直接通过apt安装,不添加仓库,因为会导致每次apt upgrade都得去官方仓库会非常慢。

通过sudo apt install dockersudo apt install docker.io安装就行了

换源

编辑/etc/docker/daemon.json

替换成如下

{"registry-mirrors" : [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com/"
]}

然后重启服务就好了 service docker restart 或者新版ubuntu使用systemctl restart docker

运行

通过docker run命令就可以运行了,例如使用下面的命令

docker run -d --name my_nextcloud -v /data/nextcloud:/data/data -p 8080:80 -e ENV1=11 nextcloud

上面的命令含义是

运行 nextcloud容器,如果本地没有这个镜像就去仓库拉取

  • -d参数表示后台运行,不会在控制台有输出
  • --name my_nextcloud表示给这个容器取了一个别称
  • -v表示与宿主机共享目录:前面是宿主机,后者是容器
  • -p 表示端口映射,:前面是宿主机,后者是容器,运行后访问宿主的8080相当于访问容器的80端口
  • -e 设置环境变量,多个变量多个-e这个选项一定要在容器名之后

更多参数看https://www.cnblogs.com/yfalcon/p/9044246.html

如果使用-d启动失败了,可以通过docker logs 容器id看到输出

查看镜像或容器

查看所有镜像docker images

查看运行中的容器docker ps

查看所有容器docker ps -a

删除镜像或容器

删除镜像

删除镜像需要保证这个镜像没有对应容器在运行,删除时如果说不能删除,可以通过添加-f参数强制删除例如

docker rmi -f 容器id或容器名

删除容器

docker rm 容器id或容器名

删除所有退出的容器

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

停止容器

docker stop 容器id或者容器名

需要注意每次运行容器的时候id是会变化的,但是镜像id是不变的

启动停止的容器

docker start 容器

attach容器

docker attach <容器名或id>

退出容器

通过attach命令进入容器之后,退出时想保持容器运行,则使用这个方法

Ctrl + P, Ctrl + q

查看所有容器的状态

docker stats

更新容器的参数

但是好像只有为数不多的参数可以

docker update 完整参考

连接两个容器例子

例如此时需要使用一个数据库容器,还有一个ubuntu容器,需要在ubuntu中连接数据库容器中的数据库

  • docker run -d --name="my" -e MYSQL_ROOT_PASSWORD="123456" mysql

    • 启动一个名称为mymysql容器,指定密码是123456 且是后台运行
  • docker ps能够看到mysql容器运行起来了,如果没有通过docker logs my看到输出,就知道错误原因了
  • docker run -it --link my ubuntu 启动一个ubuntu容器,并且通过--link参数连接my,其中-it是两个参数,但综合使用效果就是进入容器并且获得里面的shell控制台
  • 进入ubuntu控制台之后
    • 通过apt update 更新软件列表否则不能apt东西
    • apt install mysql-client安装mysql客户端
    • mysql -h my -uroot -p 然后输入密码123456应该就能连接上了

此时通过cat /etc/hosts就能看到 172.17.0.2 my 18f749131a95 这样的东西,可见上面通过-h参数指定的主机my对应的就是另一个容器的ip地址

搜索镜像和安装

  • docker search <image_name> 例如 dcoker search ubuntu

    找到需要的镜像
  • docker pull <image_name> 例如 docker pull ubuntu, 名字后面加上:<tag>就能下载到对应版本的镜像,比如docker pull ubuntu:20.04就能拉取到旧版本的ubuntu

    把镜像拉取下来

可以去 https://hub.docker.com/ 找其他版本的镜像 (如arm架构的或者不同的软件版本)

当在arm架构上使用docker时,需要考虑拉取的镜像是否能在arm上运行

修改docker的工作目录

指定镜像和容器存放路径的参数是–graph=/var/lib/docker,我们只需要修改配置文件指定启动参数即可

Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS 中的位置是:/etc/sysconfig/docker。

如果是 CentOS 则添加下面这行:

OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://
# 如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux): OPTIONS=--graph="/root/data/docker" -H fd://
# 或者
DOCKER_OPTS="-g /root/data/docker"
# 最后重新启动,Docker 的路径就改成 /root/data/docker 了。 (这个在)

参考: https://www.anquanclub.cn/5494.html

docker官方镜像换源可能会遇到的问题

  • 如果docker版本不高,在安装ubuntu 22版本以上的时候使用apt update,会报 public key is not available: NO_PUBKEY 871920D1991BC93C

    • 这个报错很有迷惑性,一直以为是缺少key,但是安装Key需要安装gpg,这就无解了,直到看到https://blog.csdn.net/fly910905/article/details/126473224 才明白这个实际上是新的系统调用导致的。需要升级docker或者使用旧版本
    • 如果不能升级docker,那么可以考虑去https://hub.docker.com/ 找到ubuntu20.04版本使用,否则需要升级docker
  • 换源

    • 每个大版本的ubuntu都会有一个代号(如Ubuntu 20.04 FocalUbuntu 22.04 Jammy),换源的时候需要注意代号是否正确
    • 此外如果是arm架构,则需要形如https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports这样的源,ubuntu-ports中才是arm架构的源

      有问题可参考 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/

attach 和 exec

  • attach 适用于容器中已经有运行shell的,可以继续shell (如果没有运行shell的,好像就没法执行命令 也不知道怎么退出,如果退出了容器会结束)

    用法 docker attach mysql
  • exec 可以使用容器执行一个命令

    用法 docker exec -it mysql bash 就能在mysql容器中打开bash进入shell

network

  • 查看所有网络 docker network ls
  • 查看某网络的详情 docker network inspect bridge

    此时就能看到其实所有容器都是连接在一起的 通过ip地址可以直接访问到,那么--link参数我猜测实际作用就是在hosts文件中添加ip地址的别名而已
  • 把容器连接进网络 docker network connect 网络名 正在运行的容器

mysql

docker run -d \
--name "mysql" \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e Innodb_use_native_aio=true \
-v /export/mysql/data:/var/lib/mysql \
--restart=on-failure:3 \
--privileged=true \
mysql

参考:https://www.cnblogs.com/Qyehui/p/15149401.html

lychee

docker run -d --name=lychee \
-v /export/lychee/conf:/conf \
-v /export/lychee/uploads:/uploads \
-v /export/lychee/sym:/sym \
-e DB_CONNECTION=mysql \
-e DB_HOST=mysql \
-e DB_PORT=3306 \
-e DB_USERNAME=root \
-e DB_PASSWORD=root \
-e DB_DATABASE=lychee \
-e PUID=1000 \
-e PGID=1000 \
-p 801:80 \
--link mysql \
lycheeorg/lychee

nginx

nginx 使用起来比较麻烦

首先通过 docker run -d --name nginx -p 80:80 nginx 运行起来一个nginx 可以尝试访问80端口看看是否正常

然后执行,把需要映射到宿主机的目录或者文件整出来 完整参考见 使用docker安装nginx

  • docker cp nginx:/etc/nginx/nginx.conf /export/nginx/etc/nginx/nginx.conf
  • docker cp nginx:/usr/share/nginx/html /export/nginx/

    然后停止删除容器
  • docker stop nginx
  • docker rm nginx

    接着再启动一次这样就好了

    docker run --name nginx -p 80:80 -v /export/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf -v /export/nginx/html/:/usr/share/nginx/html -e TZ=Asia/Shanghai --privileged=true -d nginx

老实说 感觉nginx不用docker运行也完全没有问题,只是这样的话如果需要nginx的代理功能就需要把别的容器端口映射出来


导出导入镜像

  • docker save 6a35dd59e569 > *.tar
  • docker load < *.tar
  • docker tag 999c20aee5da rep/newname

注意

  • 如果不通过--name参数指定容器名则删除或者启动操作不能使用容器,注意区分容器名和仓库名
  • 如果没有必要,那么操作的时候把容器名或者镜像名放到命令的最后能避免很多错误 (docker的参数对顺序敏感)

Docker的使用记录的更多相关文章

  1. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  2. Mesos, Marathon, Docker 平台部署记录

    Mesos, Marathon, Docker 平台部署记录 所有组件部署基于Ubuntu 14.04 x64 主机 IP 角色 master 192.168.1.3 Mesos Master, Ma ...

  3. docker 常用命令记录

    下载镜像 docker pull imagesName 查看所有镜像 docker images 查看当前运行的镜像 docker ps 运行镜像 docker run imagesName 停止运行 ...

  4. 关于docker 基础使用记录

    Docker Hub地址:https://hub.docker.com Docker Hub 存放着 Docker 及其组件的所有资源.Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 ...

  5. [docker]docker日志驱动记录nginx日志情形探究

    这里研究下容器nginx记录日志的集中情况,主要想弄明白,docker的日志--log-driver=fluentd 改成fluentd后,会不会在本地在记录一份日志 整体架构是这样的 情况1: 首先 ...

  6. docker 学习操作记录 5

    记录5 * Overheard at KubeCon: "microk8s.status just blew my mind". https://microk8s.io/docs/ ...

  7. docker 学习操作记录 5-1

    记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...

  8. docker 学习操作记录 5-2

    记录5-2 root@53d0a643a2c7:/# quit bash: quit: command not found root@53d0a643a2c7:/# exit exit -->@ ...

  9. docker 学习操作记录 4

    记录3 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...

  10. docker 学习操作记录 2

    记录2 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...

随机推荐

  1. CouchDB vs. LevelDB

    CouchDB 和 LevelDB 都是数据库系统,但它们在很多方面有着不同的设计和应用重点.下面是对这两个数据库在一些关键点上的对比: 数据模型: CouchDB:CouchDB 是一种面向文档的数 ...

  2. Gorm 入门介绍与基本使用

    Gorm 入门介绍与基本使用 目录 Gorm 入门介绍与基本使用 一.ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1 ...

  3. Go 泛型之明确使用时机与泛型实现原理

    目录 一.引入 二.何时适合使用泛型? 场景一:编写通用数据结构时 场景二:函数操作的是 Go 原生的容器类型时 场景三:不同类型实现一些方法的逻辑相同时 三.Go 泛型实现原理 Stenciling ...

  4. 通过Unity导出的Android Studio和Google安卓原生工程的结构图对比

    使用Unity导出Android Studio工程前建议查看我之前的文章<Unity2019及Unity2020打包android的环境配置>,替换或修改Unity安装目录下的basePr ...

  5. Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

    Prompt-"设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务" 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型 ...

  6. LyScript 实现绕过反调试保护

    LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的 ...

  7. Eclipse引用第三方jar包中中文注释为乱码问题

    1.修改Eclipse中文本文件的默认编码:windows->Preferences->general->Workspace->Textfile encoding设置为UTF- ...

  8. 记录开发中element树形控件数据应用在页面上的相关问题

    业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...

  9. 定制你的清爽Mac版Edge浏览器

    浏览器每次打开都有个烦人的提示要获取将来的 microsoft edge 更新,需要 macos 10.15 或更高版本,找了很久也没有解决办法,有 windows 端的解决方案,有禁止更新的解决方案 ...

  10. 关于OJ中的输入格式的问题

    输入:1 2 3 4 5 6 7 8 9 10 如上的输入,并未告诉我们终止条件,这种无上限输入的格式可以用以下格式读入 int main() { int S[100]; int i = 0; whi ...