Docker的使用记录
开始
这是第一个尝试在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 docker
和sudo 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
- 启动一个名称为
my
的mysql
容器,指定密码是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 Focal
和Ubuntu 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的使用记录的更多相关文章
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- Mesos, Marathon, Docker 平台部署记录
Mesos, Marathon, Docker 平台部署记录 所有组件部署基于Ubuntu 14.04 x64 主机 IP 角色 master 192.168.1.3 Mesos Master, Ma ...
- docker 常用命令记录
下载镜像 docker pull imagesName 查看所有镜像 docker images 查看当前运行的镜像 docker ps 运行镜像 docker run imagesName 停止运行 ...
- 关于docker 基础使用记录
Docker Hub地址:https://hub.docker.com Docker Hub 存放着 Docker 及其组件的所有资源.Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 ...
- [docker]docker日志驱动记录nginx日志情形探究
这里研究下容器nginx记录日志的集中情况,主要想弄明白,docker的日志--log-driver=fluentd 改成fluentd后,会不会在本地在记录一份日志 整体架构是这样的 情况1: 首先 ...
- docker 学习操作记录 5
记录5 * Overheard at KubeCon: "microk8s.status just blew my mind". https://microk8s.io/docs/ ...
- docker 学习操作记录 5-1
记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...
- docker 学习操作记录 5-2
记录5-2 root@53d0a643a2c7:/# quit bash: quit: command not found root@53d0a643a2c7:/# exit exit -->@ ...
- docker 学习操作记录 4
记录3 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...
- docker 学习操作记录 2
记录2 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...
随机推荐
- CouchDB vs. LevelDB
CouchDB 和 LevelDB 都是数据库系统,但它们在很多方面有着不同的设计和应用重点.下面是对这两个数据库在一些关键点上的对比: 数据模型: CouchDB:CouchDB 是一种面向文档的数 ...
- Gorm 入门介绍与基本使用
Gorm 入门介绍与基本使用 目录 Gorm 入门介绍与基本使用 一.ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1 ...
- Go 泛型之明确使用时机与泛型实现原理
目录 一.引入 二.何时适合使用泛型? 场景一:编写通用数据结构时 场景二:函数操作的是 Go 原生的容器类型时 场景三:不同类型实现一些方法的逻辑相同时 三.Go 泛型实现原理 Stenciling ...
- 通过Unity导出的Android Studio和Google安卓原生工程的结构图对比
使用Unity导出Android Studio工程前建议查看我之前的文章<Unity2019及Unity2020打包android的环境配置>,替换或修改Unity安装目录下的basePr ...
- Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”
Prompt-"设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务" 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型 ...
- LyScript 实现绕过反调试保护
LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的 ...
- Eclipse引用第三方jar包中中文注释为乱码问题
1.修改Eclipse中文本文件的默认编码:windows->Preferences->general->Workspace->Textfile encoding设置为UTF- ...
- 记录开发中element树形控件数据应用在页面上的相关问题
业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...
- 定制你的清爽Mac版Edge浏览器
浏览器每次打开都有个烦人的提示要获取将来的 microsoft edge 更新,需要 macos 10.15 或更高版本,找了很久也没有解决办法,有 windows 端的解决方案,有禁止更新的解决方案 ...
- 关于OJ中的输入格式的问题
输入:1 2 3 4 5 6 7 8 9 10 如上的输入,并未告诉我们终止条件,这种无上限输入的格式可以用以下格式读入 int main() { int S[100]; int i = 0; whi ...