开始

这是第一个尝试在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. js数组修改后会互相影响

    // 假设httpServe 是服务器返回来的数据 // 我们这里有一个需求, // 某一个区域需要对这一份数据进行展示 // 另一个区域需要只需要展示前1条数据 let httpServe = [ ...

  2. vm-insert到vm-storage链路上的配置说明

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 本文是为了解决Victoria-Metrics中的过载问题 ...

  3. Python 解析JSON实现主机管理

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据.JSON 是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对 ...

  4. C/C++ 实现正反向端口映射

    通常服务器是放在内网中,内部局域网中,并且分配了私有IP地址,而如果想要在外部直接访问内部服务器则需要端口映射,端口映射也叫做端口转发,或者叫做虚拟服务器,在渗透时当我们拿到目标机器权限以后,目标机器 ...

  5. [Java] 解析Xml配置文件

    1.解析方法 import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;impo ...

  6. Linux下修改MySQL可以远程访问

    所有操作均在MySQL命令行下执行,进入MySQL命令行:mysql -uroot -p #允许root账户远程登录 update mysql.user set host='%' where user ...

  7. Sliver C2 实战 vulntarget-f

    ‍ 网络拓扑 host ip1 ip2 ubuntu(自用) 192.168.130.14 / centos 192.168.130.3 10.0.10.2 ubuntu1 10.0.10.3 10. ...

  8. ABC 309

    直接从 F 开. F 三维偏序. 把盒子按 \(h_i\) 排序,离散化,正常跑三维偏序(注意不能相等). 还要处理 \(h_i\) 相等的情况,可以再把 \(h_i\) 从大到小排序,然后 \(w_ ...

  9. CF1834

    A 给出一个由 \(1,-1\) 组成的序列.一次操作可以让一个数变相反. 要多少次操作,才能让整个序列和非负且积等于 \(1\). 大 氵题. B 定义两个数 \(A,B\) 有一个价值:每一位上的 ...

  10. OpenWrt的dnsmasq, ipset和iptables配置

    说明 这篇文章主要用于介绍在运行OpenWrt的MT7621系列路由器上, 如果安装v2rxy并开启自动出园功能. 这里介绍的是最佳实践, 不同于常见的代理方法. 通过ipset和iptables配合 ...