- 镜像命令
# 查看docker概要信息
docker info
# 列出本地主机上的镜像
docker images
docker images -a
# 查看远程库的镜像
docker search xx
# 下载镜像`在这里插入代码片`
docker pull xx
docker rmi xx
docker rmi -f xx
# 查看镜像/容器/数据卷所占的空间
docker system df
- docker的虚悬镜像:仓库名、标签都是的镜像
- 容器命令
# 新建+启动容器
docker run [options] images [command] [arg...]
--name 为容器指定一个名称
-d daemon 启动守护式容器(后台运行)
-i interactive 以交互模式运行容器
-t tty 为容器重新分配一个伪输入终端
it通常一起使用
-p 端口
例如 docker run -it ubuntu /bin/bash
# 列出当前正在运行的容器
docker ps
# 列出所有的的容器
docker ps -a
# 列出所有的容器名
docker ps -q
# 重新启动已停止的容器
docker start xx
# 重启容器
docker restart xx
# 停止容器
docker stop xx
# 强制停止容器
docker kill xx
# 删除已停止的容器
docker rm xx
# 强制删除容器
docker rm -f xx
# 例如删除所有容器
docker rm -f $(docker ps -a -q)
# 列出日志
docker logs xx
# 查看容器内运行的进程
docker top xx
# 查看容器内部运行细节
docker inspect xx
# 进入运行的容器并以命令行交互
docker exec -it xx /bin/bash
(这样会在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止)
docker attach xx
(这样会直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止)
# 将文件从容器拷贝到主机
docker cp xx:容器内路径 目的主机路径
# 导出导入容器
(export导出容器的内容流作为一个tar归档文件,import操作为export的反操作)
# 导出
docker export xx>文件名.tar
# 导入
cat xx.tar | docker import - 镜像用户/镜像名:镜像版本号
- 退出容器
- run 进去容器,exit退出,容器停止
- run进去容器,ctrl+p+q退出,容器不停止
- UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统,对文件系统的修改作为一次提交来一层层的叠加.
好处:复用. - docker 镜像加载原理
- bootfs (boot file system)主要包含bootloader和kernel,是docker镜像的最底层,bootloader主要引导和加载kernel,boot加载完成之后整个内核都在内存中.
- rootfs(root file system)在bootfs之上,包含典型的linux的/dev,/bin等目录和文件,rootfs就是各种不同的操作系统的发型版,比如ubuntu,centos.
- commit
# 更新包管理工具
apt-get update
# 安装vim
apt-get install vim
# commit 新镜像
docker commit -m="提交的描述信息" -a="作者" xx 目标镜像名:[标签名]
# 例如
docker commit -m="add vim " -a="yao" fcbface5f slash/ubuntu:1.3
- push到阿里云
# 步骤如下
$ docker login --username=阿里云账号 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ruoyi-exec/mynginx:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ruoyi-exec/mynginx:[镜像版本号]
- 搭建私服docker resitry
# 下载registry
docker pull registry
# run
docker run -d -p 5000:5000 -v /slash/myregistry/:/tmp/registry --privileged=true registry
# curl验证私服库上有什么镜像(ip为docker的机器的ip)
curl -XGET http://ip:镜像端口(例如上面的5000)/v2/_catalog
# 将docker images改为符合私服的名称规范,例如:
docker tag mynginx:1.1 192.168.1.123:5000/myngnix:1.1
# docker 默认不允许http方式推送镜像,通过配置取消这个限制,就是更改docker这个软件的配置,例如
"registry-mirrors": [
"https://djq9mxnw.mirror.aliyuncs.com"
],
# 只增加下面这一行即可
"insecure-registries":["192.168.1.123:5000"]
# 若不生效可重启docker
# push镜像到私服
docker push 192.168.1.123:5000/myngnix:1.1
docker pull 192.168.1.123:5000/myngnix:1.1
- 数据卷
- docker挂载主机目录访问出现permission:denied ,可在挂载目录后加 --privileged=true
- 挂载目录后删除docker容器后不会删除挂载的数据卷
- rw:读写(默认)
- read only 只可读
# 容器卷的继承和共享(父容器就是之前启动过的容器,不管它现在是否在运行都可以继承)
docker run -it --privileged=true --volumes-from 父容器 --name 容器名 镜像
- 安装mysql
# 我电脑是苹果arm架构的芯,所以只能装8
docker pull mysql:8
# 在conf文件夹下新建my.cnf文件,目的是统一编码,内容如下
[client]
default-character-set=utf8mb4
[mysqld]
socket=/var/lib/mysql/mysql.sock
collation_server = utf8mb4_general_ci
character_set_server=utf8mb4
#运行docker
docker run -d -p 3306:3306 --privileged=true \
-v /Users/yaoqiang/app/data/mysql/log:/var/log/mysql \
-v /Users/yaoqiang/app/data/mysql/data:/var/lib/mysql \
-v /Users/yaoqiang/app/data/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql mysql:8
# 查看mysql编码
show variables like 'character%'
- 如果删除容器以后,重新新建容器挂载目录不变的话,数据还在
- 如果删了容器后新建启动失败,把data目录下的mysql.sock删了就行
- 安装redis
# 拉镜像
docker pull redis:6.0.8
# 主机新建文件夹data和文件redis.conf,redis.conf的内容去官网下载后粘进去
# 启动redis
docker run -d -p 6379:6379 --name myredis --privileged=true \
-v /Users/yaoqiang/app/data/redis/data:/data \
-v /Users/yaoqiang/app/data/redis/redis.conf:/etc/redis/redis.conf \
redis:6.0.8 \
redis-server /etc/redis/redis.conf
- 安装nginx
# 拉镜像
docker pull nginx:latest
- 建好文件夹和各种文件
# nginx.conf内容如下
user nginx;
worker_processes 1;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
charset UTF-8;
client_max_body_size 300m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 60;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
# default.conf内容如下
#upstream sisafezuul {
# server 192.168.11.4:8080 max_fails=2 fail_timeout=30s;
#}
#server {
# listen 80;
# server_name sietsafe.ecej.com;
# client_max_body_size 10M;
# rewrite ^(.*)$ https://$host$1 permanent;
#}
#server {
# listen 443 ssl;
# server_name etsafeadm.guizhou001.cn;
#
# ssl_certificate cert/etsafeadm.guizhou001.cn.pem;
# ssl_certificate_key cert/etsafeadm.guizhou001.cn.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
#
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location ~* /openapi {
# proxy_pass http://127.0.0.1:9999;
# }
# location ~* /safety {
# proxy_pass http://127.0.0.1:9999;
# }
# location / {
# root website/console;
# index index.html;
# }
# }
upstream distributedLock {
server 10.31.1.36:10010;
server 10.31.1.36:10086;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://distributedLock;
}
location /rewrite {
rewrite "/" http://127.0.0.1:8888/ break;
}
location /mickey.html {
root /usr/share/nginx/html/mickey;
}
#location ~* .(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css|eot|svg|ttf|woff)$ {
# index index.htm index.html;
# root /data/nfsdata/website/official;
#}
#location / {
# index index.htm index.html index.jsp;
# proxy_pass http://sisafezuul;
#}
#location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
#}
}
# html文件夹下新建 index.html,内容如下
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 启动命令
docker run -d -p 80:80 --privileged=true \
-v /Users/yaoqiang/app/data/nginx/html:/usr/share/nginx/html \
-v /Users/yaoqiang/app/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/yaoqiang/app/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /Users/yaoqiang/app/data/nginx/logs:/var/log/nginx \
--name nginx nginx
- 安装rabbitmq
# 拉镜像
docker pull rabbitmq
# 启动容器
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 \
-v /Users/yaoqiang/app/data/rabbitmq:/var/lib/rabbitmq \
--hostname myRabbit \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq
# 进入容器
docker exec -it 镜像ID /bin/bash
# 安装rabbitmq management管理插件
rabbitmq-plugins enable rabbitmq_management
# 主机访问 http://localhost:15672
# 发现totals和channel看不了,进入镜像
cd /etc/rabbitmq/conf.d/
# 把这个文件的true改为false,因为没有vim,所以用echo
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
# 退出容器,执行
docker exec -it {rabbitmq容器名称或者id} rabbitmq-plugins enable rabbitmq_management
# restart容器
- 安装zookeeper
docker run -d -p 2181:2181 --privileged=true \
-v /Users/yaoqiang/app/data/zookeeper/conf:/conf
-v /Users/yaoqiang/app/data/zookeeper/data:/data
--name myzookeeper zookeeper:3.7.1
- 安装nacos
先拉取“zhusaidong/nacos-server-m1:2.0.3”镜像,然后执行
docker run -d -p 8848:8848 \
--privileged=true \
--env MODE=standalone \
--name nacos zhusaidong/nacos-server-m1:2.0.3
- 按照seata
先拉取“apache/seata-server:latest”镜像,然后执行
docker run -d --privileged=true \
--name seata-server -p 8091:8091 \
-p 7091:7091 apache/seata-server