侧边栏壁纸
博主头像
威风博主等级

九万里风鹏正举,风休住,蓬舟吹取三山去。

  • 累计撰写 38 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Docker常用命令及安装

威风
2021-11-06 / 0 评论 / 0 点赞 / 344 阅读 / 11,790 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-11-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. docker安装

1.1 卸载系统之前的docker

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

1.2 安装docker CE

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

1.3 设置repo yum位置

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

1.4 安装docker

yum install -y docker-ce docker-ce-cli containerd.io

1.5 配置docker加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bl0ccm0u.mirror.aliyuncs.com"] //此地址配置自己阿里云的加速地址
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1.6 设置开机自启动

systemctl enable docker

2.docker命令

2.1 查看命令

2.1.1 docker images 查看镜像

参数

各个选项说明:

  • **REPOSITORY:**表示镜像的仓库源
  • **TAG:**镜像的标签
  • **IMAGE ID:**镜像ID
  • **CREATED:**镜像创建时间
  • **SIZE:**镜像大小

如果我们想拉取一个mysql镜像,需要去dockerhub上搜索

如果想自定义拉取指定版本镜像如下图所示,复制命令即可

2.1.2 docker ps -a 和 docker ps

参数

OPTIONS说明:

  • **-a :**显示所有的容器,包括未运行的。
  • **-f :**根据条件过滤显示的内容。
  • **--format :**指定返回值的模板文件。
  • **-l :**显示最近创建的容器。
  • **-n :**列出最近创建的n个容器。
  • **--no-trunc :**不截断输出。
  • **-q :**静默模式,只显示容器编号。
  • **-s :**显示总的文件大小。

docker ps -a 查看所有运行中容器包括未运行

docker ps 为查看所有运行中的容器

2.1.3 docker ps --no-trunc

经验

运用此命令场景

使用RedisDesktopManager连接redis时候发现需要密码登录,这时候管理人员告知是docker启动的redis,如何快速知道docker启动用的是什么密码?

此处命令可以看出docker启动用的参数 --requirepass后面的密码为A@1234com

2.1.4 docker ps | grep xxx

过滤

过滤查看mysql的容器

2.1.4 docker ps -a | awk '/xxx/{print $1}'

awk

此命令在批量查找批量删除,脚本语言中非常重要 awk 务必要多加练习

$0为完整输入参数

$1为第一列的展示参数

2.2 删除命令

参数

OPTIONS说明:

  • **-f :**通过 SIGKILL 信号强制删除一个运行中的容器。
  • **-l :**移除容器间的网络连接,而非容器本身。
  • **-v :**删除与容器关联的卷。

2.2.1 docker rm -rf xxx

慎用

容器强制删除

2.2.2 docker rmi xxx

删除镜像

2.2.3 docker rm -v xxx

删除容器并删除他所挂载的容器卷

2.2.4 docker rm $(docker ps -a | awk '/xxx/{print $1}')

批量删除 xxx名字的容器

$1为第一列的参数,我们docker中第一列展示的往往是容器的id所以这个命令删除的是所有容器名xxx的

2.2.5 docker rmi $(docker images -q -f dangling=true)

Dangling 意味着未使用的images表示尚未在容器中分配或使用它。例如,在运行时docker ps -a- 它将列出所有已退出和当前正在运行的容器。在任何容器内使用的任何images都是“使用过的images”。

另一方面,Dangling images只是意味着你已经创建了images的新构建,但没有给出新名称。所以你所拥有的旧images就变成了“悬空images”。那些旧images是未标记的images,并<none>在运行时在其名称上显示“ ” docker images

运行docker system prune -a,它将删除未使用和悬空的images。因此,容器中使用的任何images,无论是已退出还是当前正在运行,都不会受到影响

另外,Dockerimages由多个图层组成。Dangling images是与任何标记images无关的图层。它们不再用于目的并占用磁盘空间。

docker images --filter "dangling=true"

删除所有未被打标签的镜像

2.2.6 docker logs [OPTIONS] CONTAINER

docker logs xxxx

OPTIONS说明:

  • -f : 跟踪日志输出
  • **--since :**显示某个开始时间的所有日志
  • -t : 显示时间戳
  • **--tail :**仅列出最新N条容器日志

2.3 启动命令

2.3.1 docker run

docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

这里我们以启动一个mysql为例

每一个docker里面都是一个小型的虚拟机,也就是一个我们的linux环境

参数

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb": 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • **-m :**设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷

重要

dockerhub中有我们启动容器的环境变量

以下提供 redis rabbitmq 等集群启动例子,按需自取

2.3.2 mysql 主从搭建

创建主mysql
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
创建从mysql
docker run -p 3317:3306 --name mysql-slaver01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
修改master的主从配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
修改slaver里面的主从配置
server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

replicate-ignore-db=mysql
replicate-ignore-db=sys

replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

再加一个
主mysql产生的二进制日志是
mysql.bin
然后配置从mysql
server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

replicate-ignore-db=mysql
replicate-ignore-db=sys

replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

开放端口
systemctl start firewalld
firewall-cmd --zone=public --add-port=1935/tcp --permanen
read-only=0是不是只读的
binlog-do-db=xxx
为哪一个表生成日志


配置好了以后重启docker mysql


4.为master授权用户来他的同步数据
开启远程访问
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

GRANT REPLICATION SLAVE ON *.* to  'backup'@'%' identified by '123456';
查看master状态
show master status;
2.从mysql的配置
设置主库连接
告诉从mysql需要同步哪个节点
CHANGE MASTER TO MASTER_HOST='10.244.107.227',MASTER_USER='backup',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=0,MASTER_PORT=3306;
启动从库同步
start slave;
查看从库状态
show slave status;
主库更新,,从库跟着更新

2.3.3 redis cluster 集群搭建

1.创建6个redis节点
for port in $(seq 7001 7006); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.16.0.4
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port}  -p 1${port}:1${port} --name redis-${port} --restart always \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf; \
done


docker stop $(docker ps -a|grep redis-700 | awk '{print $1}')
docker rm $(docker ps -a |grep redis-700 | awk '{print $1}')

批量开启端口
firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent

查看开启的端口
firewall-cmd --list-ports
开启防火墙
systemctl restart firewalld.service
使用redis 建立集群

docker exec -it redis-7001 /bin/bash
redis-cli  --cluster create 172.16.0.4:7001  172.16.0.4:7002 172.16.0.4:7003 172.16.0.4:7004 172.16.0.4:7005 172.16.0.4:7006 --cluster-replicas 1

--cluster-replicas 1 每一个主节点都要有一个副本节点
运行效果

等待所有集群加入

-c 代表进入集群模式
redis-cli -c -h 172.16.0.4 -p 7001

查看节点信息 cluster info
查看节点信息 cluster nodes

2.3.4 ES 集群搭建

1.集群搭建
所有之前先运行
sysctl -w vm.max_map_count=262144

查看docker 网络,,docker network ls
docker network create --driver bridge --subnet=172.18.0.1/16 --gateway=172.18.1.1 mynet
2.准备三个master节点




for port in $(seq 1 3); \
do \
mkdir -p /mydata/elasticsearch/master-${port}/config
mkdir -p /mydata/elasticsearch/master-${port}/data
chmod -R 777 /mydata/elasticsearch/master-${port}
cat <<EOF>/mydata/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es
node.name: es-master-${port}
node.master: true
node.data: false
network.host: 0.0.0.0
http.host: 0.0.0.0
http.port: 920${port}
transport.tcp.port: 930${port}
discovery.zen.ping_timeout: 10s
discovery.seed_hosts: ["172.18.1.21:9301","172.18.1.21:9302","172.18.1.21:9303"]
cluster.initial_master_nodes: ["172.18.1.21"]
EOF


docker run --name elasticsearch-node-${port} \
-p 920${port}:920${port}  -p 930${port}:930${port} \
--network=mynet --ip 172.18.1.2${port} \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v
/mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/master-${port}/plugins:/usr/shrae/elasticsearch/plugins \
-d elasticsearch:7.4.2
done



准备三个Node节点

for port in $(seq 1 3); \
do \
mkdir -p /mydata/elasticsearch/master-${port}/config
mkdir -p /mydata/elasticsearch/master-${port}/data
chmod -R 777 /mydata/elasticsearch/master-${port}
cat <<EOF>/mydata/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es
node.name: es-master-${port}
node.master: false
node.data: true
network.host: 0.0.0.0
http.host: 0.0.0.0
http.port: 920${port}
transport.tcp.port: 930${port}
discovery.zen.ping_timeout: 10s
discovery.seed_hosts: ["172.18.1.21:9301","172.18.1.21:9302","172.18.1.21:9303"]
cluster.initial_master_nodes: ["172.18.1.21"]
EOF


docker run --name elasticsearch-node-${port} \
-p 920${port}:920${port}  -p 930${port}:930${port} \
--network=mynet --ip 172.18.1.2${port} \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v
/mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/master-${port}/plugins:/usr/shrae/elasticsearch/plugins \
-d elasticsearch:7.4.2
done

2.3.5 rabbitmq集群搭建

mkdir /mydata/rabbitmq
cd rabbitmq/
mkdir rabbitmq1 rabbitmq01 rabbitmq03
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' rabbitmq:management

docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' --link rabbitmq01:rabbitmq01 rabbitmq:management

docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15678:15672 -p 5678:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management

2.4 启动停止命令

2.4.1 docker start xxx

启动docker容器

2.4.2 docker stop myrunoob

停止docker运行中容器命令

2.4.3 docker restart myrunoob

重启docker容器命令

2.5 构建命令

2.5.1 docker build

2.5.1.1 编写Dockerfile

FROM nginx
MAINTAINER zhaojiaxu
ADD html.tar.gz /usr/share/nginx/html
ADD conf.tar.gz /etc/nginx
EXPOSE 80
ENTRYPOINT nginx -g "daemon off;"
FROM java:8
EXPOSE 8080

VOLUME /tmp
ADD target/*.jar  /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","-Xms128m","-Xmx300m","/app.jar","--spring.profiles.active=prod"]

2.5.1.2 构建本地docker镜像

docker build -f Dockerfile -t ALIYUNHUB_NAMESPACE/BRANCH_NAME-$BUILD_NUMBER .'

参数

OPTIONS说明:

  • **--build-arg=[] :**设置镜像创建时的变量;
  • **--cpu-shares :**设置 cpu 使用权重;
  • **--cpu-period :**限制 CPU CFS周期;
  • **--cpu-quota :**限制 CPU CFS配额;
  • **--cpuset-cpus :**指定使用的CPU id;
  • **--cpuset-mems :**指定使用的内存 id;
  • **--disable-content-trust :**忽略校验,默认开启;
  • **-f :**指定要使用的Dockerfile路径;
  • **--force-rm :**设置镜像过程中删除中间容器;
  • **--isolation :**使用容器隔离技术;
  • **--label=[] :**设置镜像使用的元数据;
  • **-m :**设置内存最大值;
  • **--memory-swap :**设置Swap的最大值为内存+swap,"-1"表示不限swap;
  • **--no-cache :**创建镜像的过程不使用缓存;
  • **--pull :**尝试去更新镜像的新版本;
  • **--quiet, -q :**安静模式,成功后只输出镜像 ID;
  • **--rm :**设置镜像成功后删除中间容器;
  • **--shm-size :**设置/dev/shm的大小,默认值是64M;
  • **--ulimit :**Ulimit配置。
  • **--squash :**将 Dockerfile 中所有的操作压缩为一层。
  • --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • --network: 默认 default。在构建期间设置RUN指令的网络模式

前置条件

开通容器镜像服务

2.5.1.3 登录阿里云镜像账号密码

docker login --username=刘次生气了 registry.cn-qingdao.aliyuncs.com

2.5.1.4 给镜像打标签

docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/meyes/zjx:[镜像版本号]

2.5.1.5 推送的远程阿里云镜像仓库地址

docker push registry.cn-qingdao.aliyuncs.com/meyes/zjx:[镜像版本号]

2.5.2 docker commit

从容器创建新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • **-a :**提交的镜像作者;
  • **-c :**使用Dockerfile指令来创建镜像;
  • **-m :**提交时的说明文字;
  • **-p :**在commit时,将容器暂停。

2.6 进入命令

2.6.1 docker exec -it xxx /bin/bash

参数

OPTIONS说明:

  • **-d :**分离模式: 在后台运行
  • **-i :**即使没有附加也保持STDIN 打开
  • **-t :**分配一个伪终端

如果我们想进入一个容器可以用如上命令

2.6.2 分享一个容器操作失败案例

内容场景为,因为服务器容器mysql没有把配置文件挂载出来,本人想进入容器进行配置文件修改,把mysql连接回收时间设置为最大值

docker容器内安装vim命令

apt-get update

apt-get install vim -y

apt-get install yum -y

个人把 ! 去掉了,个人因为是它排除了这些文件夹下的配置文件,容器再次启动,启动不起来,这时候容器配置文件没有挂载出来,容器在没有启动的状态下是进不去容器内部修改文件的,

首先docker ps,查看container id

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

daa516dadd07 tensorflow/tensorflow:latest-gpu-py3 “/bin/bash” 6 minutes ago Up 6 minutes 6006/tcp, 8888/tcp root-triple-xi

然后拷贝

docker cp docker-id:/origin-path /destination-path/

e.g. docker cp a9eedbbc0d43:/notebooks/ground_truth.txt /home/xi/git/triple-xi/

完成

0

评论区