docker操作笔记

是一个虚拟化平台
可以通过虚拟化方式,为应用提供可运行的容器
可更快地打包、测试以及部署应用程序
无需配置

下载docker离线包 官网下载

放到一个文件夹里执行命令

# 进入/root/setup/docker 文件夹
cd /root/setup/docker

# 为 install.sh添加执行权限
chmod +x install.sh

# 安装
./install.sh -f docker-20.10.6.tgz

安装成功后检查安装状态
docker info

启动docker服务
systemctl start docker

查看docker状态
systemctl status docker

# 设置Docker开机自启
systemctl enable docker
# 禁用Docker开机自启
systemctl disable docker
# 重新启动Docker服务
 systemctl restart docker
# 查看Docker信息
docker info
# 查看docker info中具体key的信息,例如:
docker info | grep 'Docker Root Dir:'
# 停止docker服务
systemctl stop docker

镜像加速

cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF

重启docker

下载镜像

docker pull 镜像名

docker pull hello-world

浏览镜像文件

docker images

查看镜像详情

# 语法:docker inspect 镜像名或镜像id
docker inspect hello-world

导出镜像文件
导出后给他人使用

docker save  hello-world | gzip > hello-world.tar.gz

删除镜像文件

删除镜像文件时没有使用此镜像
语法:docker image rm 镜像名或镜像id

docker image rm hello-world

导入镜像操作
从本地导入镜像

docker load < hello-world.tar.gz

运行镜像文件

docker run hello-world

查看所有运行容器

docker ps -a

删除容器

docker container rm 容器id

下载镜像

docker pull centos:7

创建并启动容器

docker run -it 镜像名 bash

退出容器

exit

查看容器日志信息

如果容器没有启动需要查看错误日志

docker container logs 容器id

停止(stop)或重启(Restart)容器(Container)
停止运行的容器,代码如下:

docker container stop 802  #802为容器自己的id

重新启动容器,代码如下:

docker container restart 802 #802位容器自己的id

进入容器 可以使用docker exec命令

docker exec -it 802 bash #802为容器id 使用docker ps -a查看id

清楚所有容器

docker container prune
数据卷操作

数据卷是一个多个容器使用的特殊目录
可以在容器之间共享和重用

创建数据卷

docker volume create container-vol # container-vol是名称

查看所有数据卷

docker volume ls

查看指定数据卷信息

docker volume inspect container-vol # container-vol是名称

启动挂载数据卷容器

把数据卷挂载到容器/root/test

docker run -it --count source=container-vol,target=/root/test centos:7 bash
docker run -it -v container-vol:/root centos:7 bash

1

删除数据卷

docker volume rm container-vol # container-vol是名称

清理无主数据卷

docker volume prune
镜像制作

我们可以在远程仓库下载需要的镜像
也可以上传到远程仓库

创建Dockerfile文件

vim  Dockerfile

注意大小写

添加如下代码

FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
    PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']

将当期目录所有的文件进行打包为jdk:8

docker build -t jdk:8 .

运行镜像文件

docker run -it jdk:8 bash
运行java程序

创建.java文件

vi hello.java

添加程序

package pkg;
class Hello{
    public static void main(String[] arges){
        System.out.println("hello world");
    }
}

编译

javac -d . hello.java

运行

java pkg.Hello
基于JDK启动sentinel

将sentinel拷贝到虚拟机

启动容器

docker run -d -p 8180:8080 --name sentinel \
-v /root/servers:/usr/sca \
jdk:8 java -jar /usr/sca/sentinel-bashboard-1.8.1.jar

8180:8080 表示sentinel默认端口是8080更改为8180
-d代表后台运行
--name表示为启动的容器起一个名字
-v /root/servers 表示宿主机路径
:/usr/sca 表示容器路径
jdk:8 java -jar /usr/sca/sentinel-bashboard-1.8.1.jarjava运行jar包

制作sentinel镜像

创建Dockerfile

FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz  /usr/local/
ADD sentinel-dashboard-1.8.1.jar  /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
    PATH=/usr/local/jdk1.8.0_51/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"]

打包

docker build -t  sentinel:8 .  #不要丢掉这里的点

运行

docker run -d --name sentinel8181 -p 8181:8080 sentinel:8  #-d 表示后台运行,-p用于指定端口映射,sentinel:8为镜像文件名
安装Mysql

拉取指定版本

docker pull mysql:8.0.23

运行镜像文件

sudo docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.23

进入容器

docker exec -it mysql bash

执行sql脚本

source /usr/ #注意存放 sql 脚本的位置 对应的目录
使用docker-compose

编写yml文件

version: '3'
services:
  mdb-admin: #名称
    image: mall/mdb-admin:1.0-SNAPSHOT #镜像名称
    container_name: mdb-admin #容器名称
    network_mode: host #使用主网络
    ports:
      - 8282:8282 #对外开放端口
    volumes:
      - /mydata/app/mdb-admin/logs:/var/logs #文件挂载
      - /etc/localtime:/etc/localtime #使用系统时间
    environment:
      TZ: Asia/Shanghai #时区
    logging:
      driver: "json-file"
      options:
        max-size: "10g" #日志文件大小
    entrypoint: java -Xms256m -Xmx512m -jar -Dspring.profiles.active=prod /mdb-admin-1.0-SNAPSHOT.jar #设置启动参数

执行命令启动

docker-compose -f docker-compose-env.yml up -d # docker-compose-env.yml是文件名称
安装Redis数据库

下载镜像文件

docker pull redis

准备文件目录

mkdir -p /usr/local/docker/redis01/conf

准备文件

touch /usr/local/docker/redis01/conf/redis.conf

启动redis

sudo docker run -p 6379:6379 --name redis01 \
-v /usr/local/docker/redis01/data:/data \
-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf 

进入redis01容器

docker exec -it redis01 bash

检测版本

redis-server -v

登录redis

redis-cli
安装Nginx

下载

docker pull nginx

创建数据卷

docker volume create nginx-vol

查看对应的目录

docker inspect nginx-vol

启动nginx

docker run --name nginx  -p 80:80 -v nginx-vol:/etc/nginx -d nginx
安装Nacos

下载

docker pull nacos/nacos-server:1.4.1

执行脚本过后进行启动

docker run  \
-e TZ="Asia/Shanghai" \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_DATABASE_NUM=1 \
-e MYSQL_SERVICE_HOST=192.168.126.129 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--name nacos \
--restart=always \
-d nacos/nacos-server:1.4.1

参数说明

时区
TZ="Asia/Shanghai"
单节点模式
MODE=standalone
数据库地址
MYSQL_SERVICE_HOST
数据库用户名
MYSQL_SERVICE_USER
数据库密码
MYSQL_SERVICE_PASSWORD
需连接的数据库名称
MYSQL_SERVICE_DB_NAME
端口映射
-p 8848:8848
任意时候重启容器,开机就能自动启动容器(需设置docker为开机自启)
--restart=always
nacos版本
nacos/nacos-server:1.4.11

容器通讯

创建虚拟网络

创建名字为 t-dachui 的虚拟网络

docker network create t-dachui

查看所有网络

docker network ls

查看网络信息

docker inspect 67d #67d 为创建的网络id

Docker

Docker 是开发运维一体化核心工具
提高开发-测试-运维软件的生命周期效率
在服务器上可以大量运行Docker容器充分使用服务器运算资源

上传 docker-images.gz 文件到/root/ 目录
导入镜像docker load -i docker-images.gz

重启 docker 服务
systemctl restart docker

复制镜像并重命名
docker tag 原来的名字 新名字
复制的镜像和被复制的镜像一模一样
只是在原来的镜像上新增加了一个标签

删除镜像名标签

docker rmi 名称

如果删除的标签只有一个那么会将镜像一同删除

导出镜像

docker save 镜像名 镜像名2 | gzip > a.gz
# 将镜像导出压缩到 a.gz压缩文件里

运行容器

docker run tomcat

查看镜像构建过程

docker history 镜像名

设置自己的CMD默认启动命令

CMD ["java", "-jar", "/e.jar", "--server.port=2001"]
# 或者 每一个中间有空格
ENTRYPOINT ["java"]
CMD ["-jar", "/e.jar", "--server.port=2001"]

覆盖默认命令
docker run eureka java -jar /a2.jar
或者
docker run --entrypoint java eureka -jar /a2.jar
例如

docker run --entrypoint ls tomcat -a -l
#
docker run -d tomcat#后台启动tomcat

--name:
每个启动的容器都可以指定一个名称,方便使用名称来操作容器

--restart=always:
docker系统服务重启,或者操作系统重启,容器可以随系统自动启动。

例如

# cat1容器可以随系统启动
docker run -d \
--name cat1 \
--restart=always \
tomcat

--rm :
我们会临时使用一个容器之后这个容器就不再使用,添加此参数器停止时自动删除容器

docker cp:
在容器和宿主机之间复制文件
例如

# 启动一个临时容器
docker run -d \
--rm \
--name tmp \
tomcat

# 把 tomcat 的 server.xml 复制到宿主机的 /root/ 目录下
docker cp tmp:/usr/local/tomcat/conf/server.xml  /root/

# 停止临时容器,会自动删除
docker stop tmp

# 修改 server.xml 中的8080端口,改成80
vim server.xml

# -v 把宿主机路径挂载到容器的一个路径
# 挂载的路径可以是文件,也可以是文件夹
# 这里把修改过的 server.xml 挂载到新启动的容器中
docker run -d \
--name cat2 \
-v /root/server.xml:/usr/local/tomcat/conf/server.xml \
tomcat

清理容器

docker rm -f $(docker ps -aq)#清理所有容器

端口映射
-p

# 端口映射
# -p 宿主机端口:容器端口
docker run -d \
--name cat1 \
-p 80:8080 \
tomcat

自动端口映射
-P 大写
根据镜像中设置暴露的端口
自动映射到宿主机相同端口

容器直接使用宿主机的网络和端口
--net host

docker run -d --name cat1 \
--net host \
tomcat

创建虚拟网络

# 新建虚拟网络 my-net
docker network create my-net

# 查看虚拟网络
docker network ls

# 查看网络描述信息
docker inspect my-net

# 查看宿主机新建的虚拟网卡
ifconfig

容器互通

# 清理容器
docker rm -f $(docker ps -aq)

# 新建两个容器 cat1 和 cat2
# 连接到虚拟网络 my-net
docker run -d --name cat1 \
--net my-net \
tomcat

docker run -d --name cat2 \
--net my-net \
tomcat

# 查看两个容器的虚拟网络ip
docker inspect cat1
docker inspect cat2

构建镜像

jdktomcat压缩文件放到一个文件夹里
jdk-8u291-linux-x64.tar.gz
apache-tomcat-10.0.6.tar.gz

创建一个Dockerfile文件

cd /root/tomcat
vim Dockerfile

添加如下内容

# 选择基础镜像
FROM centos:8

# jdk 和 tomcat 文件添加到镜像的 /usr/local/ 目录下
# ADD 指令会自动解压文件
ADD jdk-8u291-linux-x64.tar.gz apache-tomcat-10.0.6.tar.gz /usr/local/

# 切换到镜像中指定的文件夹下
WORKDIR /usr/local/apache-tomcat-10.0.6/

# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_291 \
    CATALINA_HOME=/usr/local/apache-tomcat-10.0.6 \
    PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/apache-tomcat-10.0.6/bin:$PATH

# EXPOSE 8080 只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 这个声明有两个好处:
#   1.帮助镜像使用者理解这个镜像服务的端口,以方便配置映射
#   2.在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口
EXPOSE 8080

# 设置启动命令
CMD ["catalina.sh", "run"]

执行构建
tomcat文件夹里执行

# 使用当前文件夹中的 Dockerfile 文件进行构建
# 新构建的镜像命名为 tomcat:10
docker build -t tomcat:10 ./

redis

redis 启动多个容器

docker run -d --name redis7000 -p 7000:6379 redis
docker run -d --name redis7001 -p 7001:6379 redis
docker run -d --name redis7002 -p 7002:6379 redis

添加数据

导入依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
// 服务器的地址列表
List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
list.add(new JedisShardInfo("192.168.64.131",7000));
list.add(new JedisShardInfo("192.168.64.131",7001));
list.add(new JedisShardInfo("192.168.64.131",7002));
// 连接池配置对象
GenericObjectPoolConfig config = new JedisPoolConfig();
// 新建分片连接池
ShardedJedisPool pool = new ShardedJedisPool(config, list);

// 新建连接池
ShardedJedis j = pool.getResource();

//放入100条数据
for (int i = 0; i < 100; i++) {
    j.set("k"+i,"v"+i);
}
pool.close();

主从服务
docker 启动主从

docker run -d --name redis6379 --net host redis

进入容器

docker exec -it redis6379 redis-cli

# 查看集群信息,默认是主服务器
info replication

启动两个服务器

docker run -d --name redis6380 --net host redis \
redis-server --port 6380 \
--slaveof 192.168.64.131 6379 #自己的服务器地址


docker run -d --name redis6381 --net host redis \
redis-server --port 6381 \
--slaveof 192.168.64.131 6379 #自己的服务器地址

进入容器连接端口

docker exec -it redis6380 redis-cli -p 6380
# 查看集群信息,默认是主服务器
info replication

docker exec -it redis6381 redis-cli -p 6381
# 查看集群信息,默认是主服务器
info replication

启动哨兵

哨兵的配置文件
将下方所有命令执行
里面的ip更改为自己的ip

mkdir /opt/sentinel/
cd /opt/sentinel/

# 配置文件中的 "sentinel monitor mymaster 192.168.64.150 6379 2"
# 末尾的 2 表示两个哨兵投票确认主服务器宕机,哨兵才会认为主服务器宕机
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

启动

docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5001 \
-v /opt/sentinel/5001.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5002 \
-v /opt/sentinel/5002.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf

# 进入一个哨兵容器,查看它监控的主从服务器和其他哨兵
docker exec -it sentinel5000 redis-cli -p 5000
> sentinel master mymaster
> sentinel slaves mymaster
> sentinel sentinels mymaster

集群

新增6个配置文件

mkdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005

添加配置信息

cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动这六个redis实例

docker run -d --name redis7000 \
-v /opt/redis/7000/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7001 \
-v /opt/redis/7001/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7002 \
-v /opt/redis/7002/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7003 \
-v /opt/redis/7003/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7004 \
-v /opt/redis/7004/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7005 \
-v /opt/redis/7005/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

配置集群

# 进入容器执行集群配置命令
# ip换成自己的

docker exec -it redis7000 \
redis-cli --cluster create \
192.168.64.150:7000 192.168.64.150:7001 \
192.168.64.150:7002 192.168.64.150:7003 \
192.168.64.150:7004 192.168.64.150:7005 \
--cluster-replicas 1

Elasticsearch集群

关闭防火墙

# 关闭防火墙
systemctl stop firewalld.service

# 禁用防火墙
systemctl disable firewalld.service

设置底层参数

echo 'vm.max_map_count=262144' >>/etc/sysctl.conf

重启服务器

shutdown -r now

下载镜像

docker pull elasticsearch:7.9.3

挂载目录文件

# 创建虚拟网络
docker network create es-net

# node1 的挂载目录
mkdir -p -m 777 /var/lib/es/node1/plugins
mkdir -p -m 777 /var/lib/es/node1/data

# node2 的挂载目录
mkdir -p -m 777 /var/lib/es/node2/plugins
mkdir -p -m 777 /var/lib/es/node2/data

# node3 的挂载目录
mkdir -p -m 777 /var/lib/es/node3/plugins
mkdir -p -m 777 /var/lib/es/node3/data

启动集群

# node 1
docker run -d \
  --name=node1 \
  --restart=always \
  --net es-net \
  -p 9200:9200 \
  -p 9300:9300 \
  -v /var/lib/es/node1/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node1/data:/usr/share/elasticsearch/data \
  -e node.name=node1 \
  -e node.master=true \
  -e network.host=node1 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

# node 2
docker run -d \
  --name=node2 \
  --restart=always \
  --net es-net \
  -p 9201:9200 \
  -p 9301:9300 \
  -v /var/lib/es/node2/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node2/data:/usr/share/elasticsearch/data \
  -e node.name=node2 \
  -e node.master=true \
  -e network.host=node2 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

# node 3
docker run -d \
  --name=node3 \
  --restart=always \
  --net es-net \
  -p 9202:9200 \
  -p 9302:9300 \
  -v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node3/data:/usr/share/elasticsearch/data \
  -e node.name=node3 \
  -e node.master=true \
  -e network.host=node3 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

中文分词器

下载 elasticsearch-analysis-ik-7.9.3.zip 复制到 /root/ 目录下
安装分词器

cd ~/

# 复制 ik 分词器到三个 es 容器
docker cp elasticsearch-analysis-ik-7.9.3.zip node1:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node2:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node3:/root/

# 在 node1 中安装 ik 分词器
docker exec -it node1 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node2 中安装 ik 分词器
docker exec -it node2 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node3 中安装 ik 分词器
docker exec -it node3 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 重启三个 es 容器
docker restart node1 node2 node3
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值