Docker简记

docker介绍

Docker是一个应用容器引擎,完全使用沙箱机制相互之间不会有任何接口。它只是一种虚拟化技术并不是虚拟机,其实现原理和虚拟机没有一毛关系。
大部分人对docker和虚拟机区别的理解是下面这张图


docker VS 虚拟机

如图,虚拟机的Hypervisor层会对硬件资源进行虚拟化,然后在这之上再安装独立的系统。而docker直接使用硬件资源,每个docker容器使用的也是宿主机的系统内核,所以docker相比虚拟机更轻量,速度更快。这个理解是对的,但是这里容易有个误区。按照图片中的理解,你是不是认为docker安装在了宿主机上,而docker容器运行在了docker引擎里?
docker容器本质上是宿主机的进程,Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制。docker容器并不是安装在docker引擎里。docker引擎只是在宿主机上为每个docker容器开辟了一个独立的进程。不是docker实现的这一切,它也是利用的Linux内核的轻量级虚拟化(容器)服务。
首先介绍的是Linux内核的namespace技术。在同一个 namespace 下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

docker 安装

  • 安装工具:yum install -y yum-utils
  • 设置 yum 仓库:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    yum makecache fast
  • 下载docker:yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • 启动docker:systemctl start docker
  • 开机自启动docker:systemctl enable docker
  • 查看docker信息:docker info
  • 配置docker镜像加速,方便从github拉取镜像
    vim /etc/docker/daemon.json
   "registry-mirrors": [
       "https://mirror.ccs.tencentyun.com"
  ]
}

systemctl restart docker

  • 安装portainer,portainer是一款容器管理可视化界面,方便对容器进行管理。
    docker pull portainer/portainer
    docker run -d -p 9000:9000 --restart=always -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer

  • SSL证书加密远程链接
    创建证书脚本docker_cert.sh
    注意:变量的等号左右不能有空格。字符串可以不加引号,但是如果字符串中有空格必须加单引号或者双引号

#!/bin/sh
ip=公网ip
password=密码
dir=/root/docker/cert

if [ ! -d "$dir" ];then
echo ""
echo "$dir , not dir , will create"
echo ""
mkdir -p $dir
else
echo ""
echo "$dir , dir exist , will delete and create"
echo ""
rm -rf $dir
mkdir -p $dir
fi
 
cd $dir
# 创建根证书RSA私钥
openssl genrsa -aes256 -passout pass:$password  -out ca-key.pem 4096
# 创建CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/ST=BeiJing/L=BeiJing/O=yao/CN=$ip"
# 创建服务端私钥
openssl genrsa -out server-key.pem 4096
# 创建服务端签名请求证书文件
openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:$ip,IP:0.0.0.0 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 创建签名生效的服务端证书文件 
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 创建客户端私钥
openssl genrsa -out key.pem 4096
# 创建客户端签名请求证书文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyUsage = clientAuth > extfile-client.cnf
# 创建签名生效的客户端证书文件
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# 删除多余文件
rm -f -v client.csr server.csr extfile.cnf extfile-client.cnf
# 修改证书为只读权限保证证书安全
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

编辑docker.service配置文件:
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/root/docker/cert/ca.pem --tlscert=/root/docker/cert/server-cert.pem --tlskey=/root/docker/cert/server-key.pem -H fd:// -H tcp://0.0.0.0:2376
重启:systemctl daemon-reload && systemctl restart docker

docker 常用命令

  • 导出镜像(优先使用这种方式)
    提交:docker commit <容器id> nginx:1.0.0
    导出:docker save -o nginx.tar nginx:1.0.0
    导入:docker load -i nginx.tar
    重命名镜像:docker tag [镜像id] [新镜像名称]:[新镜像标签]

  • 导出容器
    导出:docker export -o postgres.tar postgres
    导入:docker import postgres.tar postgres:latest

  • 日志
    docker logs -f --tail 10 efb78392fcc6

  • 查看镜像列表
    docker images

  • 查看正运行的容器
    docker ps

  • 查看所有容器
    docker ps -a

  • 删除镜像
    docker rmi -f 镜像ID

  • 删除容器
    docker rm -f 容器ID

  • 启动容器
    docker start 容器ID

  • 停止容器
    docker stop 容器ID

  • 重启容器
    docker restart 容器ID

  • 进入容器
    docker attach 容器ID
    attach直接进入容器启动命令的终端,不会启动新的进程。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
    docker exec -it 容器ID /bin/bash
    exec在容器中打开新的终端,启动新的进程。/bin/bash如果不管用使用/bin/sh

常见问题

1、以非root用户身份,运行Docker容器应用

容器的root用户映射到宿主机也是root用户,所以容器应用进程具有很高的权限,甚至可以对宿主机系统进行修改。为了降低潜在的安全风险,可以在非root用户下执行Docker。非root用户执行docker命令有一些限制,这时候后可以使用sudo。

2、容器挂载目录的权限问题

如果执行docker run命令的时候使用的并不是root用户。主机上的目录的权限与容器内的进程权限不匹配,可能导致无法访问或无法写入挂载的目录。这时候我们将宿主机的挂载目录权限设置为最高就可以。
chmod -R 777 {宿主机挂载目录}

常用软件命令

  • mysql
    docker run -p 3306:3306 --name mysql --privileged=true --restart=always -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/log:/logs -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -d mysql:latest --lower_case_table_names=1
  • postgres
    docker run --name postgres --restart=always -v /data/postgre/FaceService:/opt/FaceService -v /data/postgre/postgreData:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime:ro -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:12.11
  • redis (需要自己下载redis.conf文件放进去)
    docker run -d --restart=always --name=redis -p 6379:6379 -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data redis:latest redis-server /etc/redis/redis.conf --appendonly yes
  • tomcat
    docker run -d -p 8090:8080 --name tomcat --restart=always -v /data/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容