Docker小总结

Docker 教程,源码翻译【周立的博客】
Docker 命令大全【菜鸟教程】
docker-compose
Docker 容器卷
Dockerfile
Docker 网络
Windows访问Linux虚拟机里面的Docker容器
Docker 命令大全—官方文档

概念

更新时间2020-04-29 14:27:34

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
运行中的这个镜像称为容器,容器启动是非常快速的。

1
2
3
4
5
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

在这里插入图片描述

安装

更新时间2020-04-29 11:27:32
安装VMware,安装镜像,配置Linux网络相关参考:
Windows下载+安装VMware Workstation 15.5.1 Pro
使用VMware15安装镜像CentOS-7-x86_64-DVD-1511.iso,并设置Linux网络

2020-07-31 15:48:19

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
### 安装新版 Docker ###

0. 更新 yum(这个会久一点,如果卡死了,就重新执行此命令)
yum -y update

1. 安装工具
yum -y install yum-utils

2. 添加软件源信息 #===> 执行其中一个就行了,第一个是官网,第二个是阿里云
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装新版 Docker #===> 如果下载太慢,结束命令,换个镜像源再进行下载
yum -y install docker-ce docker-ce-cli containerd.io

4. 添加镜像加速
mkdir -p /etc/docker/ ; echo '{ "registry-mirrors": ["https://wzl8hdkx.mirror.aliyuncs.com"] }' > /etc/docker/daemon.json

5. 重新加载配置文件
systemctl daemon-reload

6. 启动 Docker,并设置开机自启动
systemctl start docker ; systemctl enable docker

7. 关闭防火墙,并永久禁用
systemctl stop firewalld ; systemctl disable firewalld

8. docker 命令 tab 补全
yum -y install bash-completion

source /usr/share/bash-completion/bash_completion ; source /usr/share/bash-completion/completions/docker


### 卸载 Docker ###

1. 卸载Docker Engine,CLI和Containerd软件包:
yum -y remove docker-ce docker-ce-cli containerd.io

2. 主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
rm -rf /var/lib/docker



### 更新 Docker (卸载,重装)###
》》》执行完卸载之后,再进行查找,再删除,再重复上面的安装步骤《《《
[root@localhost ~]# yum list installed | grep docker
docker.x86_64 2:1.13.1-161.git64e9980.el7_8 @extras
docker-client.x86_64 2:1.13.1-161.git64e9980.el7_8 @extras
docker-common.x86_64 2:1.13.1-161.git64e9980.el7_8 @extras
[root@localhost ~]# yum -y remove docker docker-client docker-common

1)、sed -i 's/--selinux-enabled/--selinux-enabled=false/g' /etc/sysconfig/docker解决Docker安装成功启动不起来问题:Failed to start Docker Application Container Engine.
2)、上面是我的阿里云镜像地址,你也可以使用。
也可以使用163网易地址:http://hub-mirror.c.163.com
也可以使用你自己的阿里云镜像地址

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看版本
docker -v
docker version

# 查看信息
docker info

# 启动 Docker
systemctl start docker

# 关闭 Docker
systemctl stop docker

# 重启 Docker
systemctl restart docker

# 开机启动 Docker
systemctl enable docker

镜像

如果标签为latest,可以省略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查找镜像
docker search 镜像名称

# 指定版本查找镜像
docker search 镜像名称:标签

# 拉取镜像
docker pull 镜像名称:标签

# 查看本地镜像
docker images
docker images -a ===> 一些镜像可能会构建失败(不可用镜像),也会显示出来。

# 删除镜像
docker rmi 镜像名称:标签
docker rmi 镜像ID
docker rmi (docker images -aq)
docker rmi -f 镜像ID ===> 强制删除镜像(多个镜像ID重复,镜像打包不成功)

# 查看镜像构建过程
docker history 镜像ID

# 查看Redis构建过程,命令显示全部
docker history redis --no-trunc

上传镜像

1)、首先你需要一个Docker的账户,没有就去注册一个,并创建好仓库。
通常仓库名就是对应镜像的名称,例如一些仓库名:redis,tomcat,mysql 。。。
https://hub.docker.com/

2)、提交镜像之前,要先登录输入账户名,密码
docker login登录成功会提示:Login Succeeded
docker logout退出账户,退出成功会提示:Removing login credentials for https://index.docker.io/v1/
在这里插入图片描述

3)、把你要上传的镜像,重新换一个名称和标签。否则不知道上传到哪个仓库
docker tag 本地镜像名:标签 账户名/仓库名:标签

例如:docker tag mytomcat:1.0 a1697752105/tomcat:1.0
这时,我的docker images列表就会多一个镜像

4)、上传本地镜像到DockerHub仓库。上面docker tag就是为了把镜像生成符合上传的格式
docker push 账户名/仓库名:标签

5)、查找你的仓库
docker search 仓库名

6)、拉取你仓库的镜像
docker pull 账户名/仓库名:标签

容器

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run 运行容器 如果docker images中没有会自动pull拉取镜像
--name 容器名称:指定容器名称
-d:后台运行
-p Linux端口:容器端口
-P:大写表示随机映射端口
--restart=always:随Docker一起启动
-e 参数,表示配置环境 environment
-v Linux目录/文件:容器目录/文件
--network name:指定网络
-it 交互式启动。
什么意思呢?例如:进入 centos 镜像,就进不去,加上-it启动就可以进入容器了
--rm 启动容器后,停止之后,自动清除容器。
也就是以前的 docker stop xxx ===> docker stop xxx ; docker rm -f xxx

docker run -it --rm … 一般用来测试,用完就删
例如:docker run -it --rm tomcat:9.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 容器重命名
docker rename 容器id/容器名称 容器新名称

# 更新容器(自启动,关闭自启动)
docker update 容器1 [容器2 容器3 ...] --restart always
docker update 容器1 [容器2 容器3 ...] --restart no

# 停止容器
docker stop 容器id/容器名称

# 停止多个容器,同理可以启动,删除多个容器
docker stop name1 name2 name3 ...

# 启动容器
docker start 容器id/容器名称

# 重启容器
docker restart 容器id/容器名称

# 删除停止的容器
docker rm 容器id/容器名称

# 强制删除容器
docker rm -f 容器id/容器名称

# 强制删除所有容器
docker rm -f (docker ps -aq)

# 进入容器【如果bash不行,可以依次尝试换成 sh】
docker exec -it 容器id/容器名称 bash

# 执行容器的CMD命令
docker attach id

# 查看容器日志
docker logs 容器id/容器名称

# 查看全部日志
docker logs --tail 999999 容器id/容器名称

# 显示全部日志(-t:timestamps显示时间戳 -f:follow跟踪日志输出)
docker logs -tf id

# 滚动方式显示10条
docker logs -tf --tail 10 id

# 查看top信息
docker top id

# 查看容器用了多少内存,CPU
docker stats id

# 查看容器所有信息。哪个镜像,环境变量,bash地址,网络,端口号…
docker inspect 容器id/容器名称

# 可以使用表达式查看容器IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器id/容器名称

# 拷贝容器内容的数据。无论容器是否停止,都可以拷贝
docker cp 容器id:容器路径 Linux路径

# 把文件放入容器
docker cp Linux路径 容器id:容器路径

# 把容器重新生成一个本地镜像,docker images列表就会多一个镜像
docker commit -a="作者" -m="提交描述" 容器id 要创建的镜像名:[标签名]

给容器安装命令

这些是nginx的容器,在容器内执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ip
apt-get -y update && apt-get -y install iproute2

# ping
apt-get -y update && apt-get -y install iputils-ping

# ifconfig
apt-get -y update && apt-get -y install net-tools

# curl
apt-get -y update && apt-get -y install curl
检测端口
curl ip:port
curl https://www.baidu.com/

启动的容器

Redis

启动容器
docker run --name redis01 -p 6379:6379 -d redis

操作Redis客户端
docker exec -it redis01 redis-cli

docker exec -it redis01 bash进入容器之后再输入redis-cli

》》》如果想指定自己的redis.conf配置文件
也可以去下载Redis 配置【官网】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建目录
mkdir -p /app/docker/redis/

# 进入目录
cd /app/docker/redis/

# 下载配置文件,稳定版
wget http://download.redis.io/redis-stable/redis.conf

# 修改为所有IP可访问
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' redis.conf

# 启动容器
docker run --name redis01 -p 6379:6379 \
-v /app/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf \
-d redis \
redis-server /usr/local/etc/redis/redis.conf

MySQL

更新时间2020-04-29 14:21:27

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 步骤1:启动容器
docker run --name mysql01 -p 3306:3306 \
-v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 步骤2;进入容器
docker exec -it mysql01 bash

# 步骤3:连接 mysql
mysql -uroot -p123456

# 步骤4:设置 root 用户为所有 ip 可连接,密码是'123456'
# 'root'@'%' ... '123456' 表示 root 可以被任意ip 登录,密码是 123456。若把 % 换为 127.0.0.1,表示只有本机可登录
alter user 'root'@'%' identified with mysql_native_password by '123456';

# 步骤5:断开 mysql 连接
exit

# 步骤6:退出容器
exit
------------------------
  • 命令解释
    1
    2
    3
    4
    5
    6
    7
    docker run   表示容器运行指令
    -p 3306:3306 表示 Linux端口:容器端口
    --name mysql01 表示设置容器名称为 mysql01 这里设置的名称不可以和 docker ps -a 指令查出的 NAMES 列名称相同,否则会报错
    -e MYSQL_ROOT_PASSWORD=123456 表示设置密码123456 少了此段话,容器启动也会报错
    -d 表示后台运行
    mysql 表示容器名称 因为我名称为mysql的镜像标签为 latest 所以不用设置标签,表示默认,也可以设置为 mysql:latest 如果标签不是 latest 就设置为mysql:标签ID
    --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 表示设置编码
  • Wifi 密码
    2021-07-17 12:54:46 补充
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker run --name mysql01_wifi_password -p 3306:3306 \
    -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Qq123... -d mysql \
    --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    docker exec -it mysql01_wifi_password bash

    mysql -uroot -pQq123...

    alter user 'root'@'%' identified with mysql_native_password by 'Qq123...';

    exit

    exit

Tomcat

docker run --name tomcat01 -d -p 8080:8080 tomcat

RabbitMQ

docker run --name rabbitmq01 -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management

1
2
3
4
5
6
修改默认用户名,密码,虚拟主机
不指定默认guest,guest,/

-e RABBITMQ_DEFAULT_USER=user
-e RABBITMQ_DEFAULT_PASS=password
-e RABBITMQ_DEFAULT_VHOST=my_vhost

Elasticsearch

docker run --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.4.0

安装ik分词器(三步)

1)、进入容器(elasticsearch01是docker已经运行的容器名称)
docker exec -it elasticsearch01 /bin/bash

2)、安装分词器7.4.0,因为我的镜像是elasticsearch:7.4.0,安装过程中输入y即可
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.0/elasticsearch-analysis-ik-7.4.0.zip

3)、分词器安装完成之后,重启elasticsearch容器
docker restart elasticsearch01

文章来自Linux使用Docker启动Elasticsearch并配合Kibana使用,安装ik分词器

Kibana

docker run --name kibana01 --link elasticsearch01:elasticsearch -p 5601:5601 -d kibana:7.4.0
注意:
1)、这里的elasticsearch01是运行的elasticsearch容器名称
2)、第一次访问可能比较慢,稍等一下

Zookeeper

docker run --name zookeeper01 -p 2181:2181 -d zookeeper

启动Docker自动启动容器
docker run --name zookeeper01 -p 2181:2181 --restart=always -d zookeeper

MongoDB

docker run --name mongo01 -d -p 27018:27017 mongo

Consul

运行容器
docker run --name consul01 -p 8300:8300 -p 8500:8500 -p 8600:8600 -d consul

访问Consul首页
http://192.168.1.1:8500/

交互式进入【这里是/bin/sh 而不是/bin/bash】
docker exec -it consul01 /bin/sh

查看版本号【已交互式进入容器】
consul -v

映射容器文件
Consul集群,端口详解

Nacos

Nacos Docker 快速开始—官方文档

1)、单机版
docker run --name nacos01 -p 8848:8848 -e MODE=standalone -d nacos/nacos-server

这里192.168.1.1是我的虚拟机地址(第一次启动,可能需要稍微等会儿~)
http://192.168.1.1:8848/nacos/

账号,密码默认nacos
在这里插入图片描述

2)、集群版
参考Nacos 集群版安装

Nginx

2020-05-27 10:47:49

以下命令直接全部复制,执行即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

mkdir -p /app/docker/nginx/{conf,log}

docker run --name nginx00 -d nginx

docker cp nginx00:/etc/nginx/nginx.conf /app/docker/nginx/conf/

docker cp nginx00:/etc/nginx/conf.d/default.conf /app/docker/nginx/conf/

docker cp nginx00:/usr/share/nginx/html /app/docker/nginx/

docker rm -f nginx00

docker run --name nginx01 -p 80:80 \
-v /app/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /app/docker/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf \
-v /app/docker/nginx/html/:/usr/share/nginx/html \
-v /app/docker/nginx/log/:/var/log/nginx \
-d nginx

在这里插入图片描述

》》》指定网络
Docker启动Nginx负载均衡Nacos集群,指定网络启动Nginx参考这里

1
2
3
4
5
6
7
docker run --name nginx01 -p 80:80 \
-v /app/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /app/docker/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf \
-v /app/docker/nginx/html/:/usr/share/nginx/html \
-v /app/docker/nginx/log/:/var/log/nginx \
--network example_default \
-d nginx

Sentinel

docker run --name sentinel01 -p 8858:8858 -d bladex/sentinel-dashboard
账号密码都是sentinel,登录地址http://192.168.1.1:8858/

Seata

1)、启动容器,这个容器只作拷贝文件使用
docker run --name seata01 -p 8091:8091 -d seataio/seata-server:1.0.0

2)、拷贝容器
docker cp seata01:/seata-server/resources /app/docker/seata

3)、拷贝之后,强制删除容器
docker rm -f seata01

4)、进入目录
cd /app/docker/seata/resources

5)、把原本的file.conf文件,进行改名
mv file.conf bak.file.conf

6)、拷贝一份,新文件叫file.conf,再进行修改
cp file.conf.example file.conf
vi file.conf
三个地方:事务组名称,储存方式,数据库连接信息
在这里插入图片描述

7)、连接上指定的mysql,并执行下面创表SQL。执行完毕之后,会有一个库,三个表

建库建表SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
create database if not exists seata character set utf8;

use seata;

-- the table to store GlobalSession data
drop table if exists `global_table`;
create table `global_table` (
`xid` varchar(128) not null,
`transaction_id` bigint,
`status` tinyint not null,
`application_id` varchar(32),
`transaction_service_group` varchar(32),
`transaction_name` varchar(128),
`timeout` int,
`begin_time` bigint,
`application_data` varchar(2000),
`gmt_create` datetime,
`gmt_modified` datetime,
primary key (`xid`),
key `idx_gmt_modified_status` (`gmt_modified`, `status`),
key `idx_transaction_id` (`transaction_id`)
);

-- the table to store BranchSession data
drop table if exists `branch_table`;
create table `branch_table` (
`branch_id` bigint not null,
`xid` varchar(128) not null,
`transaction_id` bigint ,
`resource_group_id` varchar(32),
`resource_id` varchar(256) ,
`lock_key` varchar(128) ,
`branch_type` varchar(8) ,
`status` tinyint,
`client_id` varchar(64),
`application_data` varchar(2000),
`gmt_create` datetime,
`gmt_modified` datetime,
primary key (`branch_id`),
key `idx_xid` (`xid`)
);

-- the table to store lock data
drop table if exists `lock_table`;
create table `lock_table` (
`row_key` varchar(128) not null,
`xid` varchar(96),
`transaction_id` long ,
`branch_id` long,
`resource_id` varchar(256) ,
`table_name` varchar(32) ,
`pk` varchar(36) ,
`gmt_create` datetime ,
`gmt_modified` datetime,
primary key(`row_key`)
);

8)、修改之前,先备份一份,再进行修改
cp registry.conf bak.registry.conf
vi registry.conf
两个地方:注册类型,注册地址
在这里插入图片描述

9)、这时候,再启动容器
注意:启动容器之前,要先完成上面的步骤,并启动MySQL,Nacos

1
2
3
docker run --name seata01 -p 8091:8091 \
-v /app/docker/seata/resources/:/seata-server/resources/ \
-d seataio/seata-server:1.0.0

10)、可以查看日志
docker logs seata01

11)、可以交互式进入容器
docker exec -it seata01 sh

在这里插入图片描述

SQL Server

注意:这里我设置的密码是Qq123...,你可以改为别的密码,但最好有大小写数字符号,否则可能启动容器出错。

1
2
3
docker run --name sql-server01 -p 1433:1433 \
-e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Qq123...' \
-d microsoft/mssql-server-linux:2017-latest

Centos

2020-06-09 09:00:21
这个是latest版本,有ip,ping命令

启动docker run -it --name centos01 -d centos /bin/bash

进入docker exec -it centos01 bash

Kafka

2020-08-27 15:19:58 开始搞,2020-08-31 17:21:44 终于搞好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 1. 创建文件夹,用于放 docker-compose.yml 文件
mkdir -p /app/docker/kafka

# 2. 进入目录
cd /app/docker/kafka

# 3. 编辑。下面的,你需要更改 192.168.1.1 为你自己虚拟机的 ip 即可
cat >> /app/docker/kafka/docker-compose.yml <<EOF
######## start ########
version: '2'

services:
zookeeper01:
image: wurstmeister/zookeeper
container_name: zookeeper01
ports:
- "2181:2181"
kafka01:
image: wurstmeister/kafka
container_name: kafka01
ports:
- "9092:9092"
depends_on:
- zookeeper01 # 先启动容器 zookeeper01(这里所指定的是 services 的名称,而不是容器名称)
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ZOOKEEPER_CONNECT: zookeeper01:2181 # 这里的 zookeeper01 为 zookeeper services 的名称
# KAFKA_BROKER_ID: 0
KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1" # 创建 topic
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 # 监听地址
KAFKA_ADVERTISED_listeners: PLAINTEXT://192.168.1.1:9092 # 代理地址,这里的 192.168.1.1 是我 Linux 虚拟机的 ip
volumes:
# 使用容器内的命令 docker ps/images,可以发送给 docker 守护进程
# 这容器内部安装了 docker,也可以使用 - /usr/bin/docker:/usr/bin/docker 来进行不安装使用 docker 命令
- /var/run/docker.sock:/var/run/docker.sock
######## end ########
EOF






# 4. 启动
docker-compose up -d


# 5. 查看启动状态
docker-compose ps

docker ps -a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 6. 操作 kafka01 容器

》》》进入容器,即可执行对应的命令
docker exec -it kafka01 bash

》》》也可以不进入容器,进行操作【如下】
docker exec -it kafka01 命令


》》》查看所有 topic 【此时的 kafka01 是 kafka 容器名称,zookeeper:2181 中的 zookeeper 是 zookeeper 的容器名称】
docker exec -it kafka01 kafka-topics.sh --list --zookeeper zookeeper:2181

》》》查看 topic test_forward 有多少 Partition Leader Replicas
docker exec -it kafka01 kafka-topics.sh --describe --zookeeper zookeeper:2181 --topic test_forward

》》》查看 topic test_forward 下所有消息。--from-beginning:每次都从0开始
docker exec -it kafka01 kafka-console-consumer.sh --bootstrap-server zookeeper:9092 --topic test_forward --from-beginning

》》》创建 topic abc
docker exec -it kafka01 kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic abc

》》》删除 topic abc
docker exec -it kafka01 kafka-topics.sh --delete --zookeeper zookeeper:2181 --topic abc

FTP

2021-01-21 16:12:45

注意:这个不能在 mac 上的 docker 使用

一行代码简单粗暴(账号密码都是“ftp”,其中 FTP 连接之后的根目录指向我的“/app/docker/ftp”)
docker run --name ftp01 -p 21:21 -p 21100-21110:21100-21110 -v /app/docker/ftp:/home/vsftpd -e FTP_USER=ftp -e FTP_PASS=ftp -d fauria/vsftpd

portainer

参考:Docker 图形化工具 portainer