开始

这是第一个尝试在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. csv用Excel打开出现乱码

    CSV用Excel打开出现乱码 今天出现一个问题 使用wps打开不会出现乱码.但使用 excel 打开的时候会出现乱码. 其实在我们把文件流转成文件的时候需要在bolb 对象前加上unicode标识, ...

  2. 【VictoriaMetrics】一个小优化:循环改查表,性能提升56.48 倍

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 做了一个 vm-storage 数据文件 merge 的工 ...

  3. # 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

    越来越多的客户把OpenIM用到了生产环境,由于新特性持续迭代和bug修复,会涉及到后续的升级方案,为了让大家后续从容应对,本文重点总结OpenIM对未来版本管理的思路和方案.同时,官网对于文档进行了 ...

  4. 在vscode中运行bat文件(执行bat)并解决中文乱码问题

    使用vscode编写bat脚本让工作流得到了极大的改善 以前:在文本编辑器中写完,保存,回到资源管理器双击bat运行,再循环重复 现在:在vscode中编写bat,按下快捷键执行bat 在vscode ...

  5. WinForm之ComboBox实现模糊查询

    ComboBox实现模糊查询 第一步:在Form_Load事件中绑定数据源 第二步:写一个方法,返回一个List<string>类型的集合来存储控件中的Items 第三步:在Form_Lo ...

  6. Nexus系列:简介和安装(Windows、Linux)以及反向代理Nexus

    目录 简介 安装 Windows Linux Nexus相关命令 Nginx反向代理Nexus 简介 Sonatype Nexus是一个Maven仓库管理器,可以节省网络带宽并加速项目搭建的进程.它可 ...

  7. VS Code 使用

    Tips 总结 1. VSCode显示空格和tab符号 1.打开setting,在搜索框中输入renderControlCharacters,选中勾选框,即可显示tab 2.在搜索框中输入render ...

  8. (python)代码学习||2024.2.3||题目是codewars上的【Validate Sudoku with size `NxN`】

    题目的要求是写一个Sudoku类,类中要有一个实例函数判断传给对象的二维数组是否符合数独规则 题目链接:https://www.codewars.com/kata/540afbe2dc9f615d5e ...

  9. BeginCTF 2024(自由赛道)MISC

    real check in 题目: 从catf1y的笔记本中发现了这个神秘的代码 MJSWO2LOPNLUKTCDJ5GWKX3UN5PUEM2HNFXEGVCGL4ZDAMRUL5EDAUDFL5M ...

  10. NOI 2019 补全记录

    D1T1 回家路线 好久之前写的,忘了具体细节,但是发现有平方项所以考虑拆项之后斜率优化. D1T2 机器人 考虑 DP. 记 \(f_{l,r,i}\) 表示 \([l,r]\) 这段区间,最大值为 ...