docker 常用命令
一、帮助命令:
1. 启动 systemctl start docker
2. 停止 systemctl stop docker
3. 重启 systemctl restart docker
4. 开机自启 systemctl enable docker
5. 查询状态: systemctl status docker
6. 查询docker 信息 docker info
7. 查询命令 docker -h
6. 查询指定命令的使用 docker 命令 -h ,如 docker ps -h
二、镜像的相关命令:
1. 列出所有的镜像 docker images 或者 docker image ls 或者docker image list (注意 images和image的区别)
2. 搜索仓库有哪些镜像 docker search --limit 5 redis 搜索仓库中前5个redis镜像
3. 拉取镜像 docker pull msql:5.0 如没指定版本,就拉取最新版本
4. docker system df 查询docker的磁盘使用情况
5. docker system prune 清除停止的容器,没有使用的网络,虚悬镜像
6. 移除镜像 docker rmi 镜像id
7. 查询虚悬镜像(没有仓库名称和标签名)docker image ls -f dangling=true
8. 清除虚悬镜像 docker image prune
三容器命令:
1. 运行一个容器的命令格式 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 如:docker run -it -p 6379:6379 --name redis redis:5.0 /bin/bash 又如 docker run -d --name mysql mysql:5.7
1.注意: -d代表后台运行,-it代表前台交互模式运行,有些容器使用-d启动后会立刻停止
然后docker ps -a 进行查看, 会发现容器已经退出 很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
2. 通过run 进入容器,如 docker -it ... /bin/bash 推出容器时,使用 exit命令,容器也会退出,可以使用 ctrl+p+q退出,如果是容器创建完后,使用docker exec -it 容器id /bin/bash 进入容器,再使用exit命令,容器不会关闭
2. 容器启动 docker start 容器id /容器关闭 docker stop 容器id /容器重启 docker restart 容器id /容器强制关闭 docker kill 容器id /删除 docker rm 容器id / 一次删除多个 docker rm -f $(docker ps -a -q) 或 docker ps -a -q |xargs docker rm
3. 查询容器日志docker logs 容器id
4. 查询容器内部运行的进程 docker top 容器Id
5. 查询容器内部的细节: docker inspect 容器Id
6. 进入容器内部: docker attach 容器Id 、docker exec -it 容器id /bin/bash 第一种方法使用exit退出容器时,容器会停止
7. 容器中拷贝文件到主机 docker cp 容器id: 文件路径 主机文件路径,如 docker cp docker cp b09ec4f346be:/data/dd.txt /pp.txt
8. 从主机中拷贝文件到容器: docker cp 主机文件 容器:目的路径 如 docker cp /usr/bb.txt b09ec4f346be:/data/kk
9. 导出容器作为镜像 docker export 容器Id -o xxx.tar
10. 导入xxx.tar作为镜像 docker import xxx.tar redis:5.7
四:容器发布到私服
1. 将容器打包成镜像 docker commit -a '作者' -m '描述' 容器Id 镜像名称:Tag 如 docker commit -a 'yangxiaohui' -m '这是特殊的带有vim功能的镜像' xxxx myubuntu:1.0
2. 将docker 镜像推送到阿里云服务器,https://promotion.aliyun.com/ntms/act/kubernetes.html 登录阿里云,点击右上角控制台找到镜像服务,然后按说明操作即可
3. 私服搭建参考 https://blog.csdn.net/weixin_37926734/article/details/123279987
五: 目录文件挂载
1. docker run -v 宿主机文件:容器文件 镜像Id 有时在操作挂载文件时会报没有权限,此时可以使用 docker run --privileged=true -v 宿主机文件:容器文件 镜像Id
2. 如果挂载时要求宿主机只有只读权限:docker run --privileged=true -v 宿主机文件:容器文件:ro 镜像Id
3. 继承:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
六: 常用软件安装
1.docker 安装mysql时,需要修改配置,不然插入中文会报错 docker run --name mysql5.7 -v /mysql/conf:/etc/mysql/conf.d -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yangxiaohui -d mysql:5.7
在主机mysql/conf文件夹下创建my.cnf文件,并且添加上
[client]
docker run -p 3307:3306 --name mysql-master --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -p 3308:3306 --name mysql-slave --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
主节点my.cnf:
[mysqld] ## 设置server_id,同一局域网中需要唯一 server_id=101 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mall-mysql-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=mixed ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
从节点: my.cnf
[mysqld] ## 设置server_id,同一局域网中需要唯一 server_id=102 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用 log-bin=mall-mysql-slave1-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=mixed ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ## relay_log配置中继日志 relay_log=mall-mysql-relay-bin ## log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 ## slave设置为只读(具有super权限的用户除外) read_only=1
主节点创建账号:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
从库执行如下命令:
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒
主库执行show Master status; 可以找到 master_log_file 和 master_log_pos
从库执行 start slave;
4. redis集群搭建 hash槽分配
# 三主三从集群,分配2^14-1个哈希槽 0-16383 docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6381 docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6382 docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6383 docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6384 docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6385 docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6386 进入节点一 --cluster-replicas 1 的意思是每个节点分配一个副本,执行如下命令,创建集群 redis-cli --cluster create 192.168.233.10:6381 192.168.233.10:6382 192.168.233.10:6383 192.168.233.10:6384 192.168.233.10:6385 192.168.233.10:6386 --cluster-replicas 1 进入其中一个节点执行命令: redis-cli -c -h 192.168.56.233.10 -p 6382 集群监控: 查询集群详情 redis-cli --cluster check 192.168.233.10:6383 查询集群部分信息 cluser info /cluster status 扩容:新增节点 7和 8 docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6387 docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6388 进入 6387节点将新增的6387作为master节点加入集群 redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381 redis-cli --cluster add-node 192.168.233.10:6387 192.168.56.233:6381 6387 就是将要作为master新增节点 6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群 刚加入时分配hash槽位是0 重新分派槽号 命令:redis-cli --cluster reshard IP地址:端口号 redis-cli --cluster reshard 192.168.233.10:6381 将 6388作为从节点加入到6387中 命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID redis-cli --cluster add-node 192.168.233.10:6388 192.168.233.10:6387 --cluster-slave --cluster-master-id 6e535b3211a1d1dbec0272f8e9797f7409641bde -------这个是6387的编号,按照自己实际情况 缩容: 下线6388 命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID 1.redis-cli --cluster del-node 192.168.233.10:6388 b71f9c0f371e6485ee2b925ccfd47b1e4deef19e 2. 将6387的槽位清空,多出的槽位给6381 (根据提示操作即可) redis-cli --cluster reshard 192.168.233.10:6381 3. 删除6387节点 命令:redis-cli --cluster del-node ip:端口 6387节点ID redis-cli --cluster del-node 192.168.233.10:6387 6e535b3211a1d1dbec0272f8e9797f7409641bde
打包成镜像: docker build -t 镜像:TAG .
FROM java:8 # 这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /tmp 中写入的信息都不会记录进容器存储层,当你用docker run 运行容器时,没有用 -v指定挂载目录,这个匿名卷就会挂载在指定目录 VOLUME /tmp # 指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点 WORKDIR /
#将 jar包拷贝到容器并重新命名 COPY target/erp-1.0-SNAPSHOT.jar erp.jar # 指定编码 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en # 下面的命令会修改erp.jar的访问时间和修改时间,此外没多大作用 RUN bash -c "touch /erp.jar"
#下面的命令是让docker 容器运行在东八区,默认是0时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone # 声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务 EXPOSE 8080 #指定容器启动程序及参数 <ENTRYPOINT> "<CMD>"tail CMD java ${JAVA_OPTS} -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -jar erp.jar #ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom","-jar","erp.jar"]
九.docker 网络,为了解决docker容器ip地址在重启后会变更的问题,有了这个功能后,docker 容器之间可以通过容器名称相互ping通
1. 查询有哪些可用网络 docker network ls
2. 查询容器使用哪些网络 docker inspect 容器Id | tail -n 20
3.删除一个容器网络 docker network rm 网络Id
4. 删除没有使用的网络 docker network prune
5. 容器连接某个网络 docker network connect 网络Id 容器Id
6. 容器关闭某个网络 docker network disconnect 网络Id 容器Id
网络的模式:
bridge模式:创建时 docker run --network bridge 这个是默认形式,使用网卡docker0
host模式: 创建时 docker run --network host
none模式: 创建时 docker run --network none 代表禁用网络功能,只有localhost能访问
container: 创建时 docker run --network container:容器Id
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
bridge:
host:
container: