yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
systemctl start docker
systemctl enable docker
vim /etc/docker/daemon.json
添加
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
docker search [镜像名称]
docker pull [镜像名称] [版本号]
docker build -t [镜像名称] [Dockerfile文件路径]
运行 centos 容器
docker run centos /bin/echo "Hello World"
运行容器,并进入容器内部
docker run -i -t centos /bin/bash
退出
Ctrl + D
运行容器,并执行容器内的脚本
docker run -d oracle/jdk:1.8 sh -c "sh start.sh"
运行 spring-boot容器
docker run -d -p 7001:8080 -v $PWD/logs:/logs spring-boot/spring-docker:1.0 sh -c "sh start.sh 8080"
-d:后台运行7001:容器端口8080:容器内部服务端口-v $PWD/logs:/logs:将当前目录下的 logs目录挂载到容器内部的 logs 目录查看运行中的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7cd5b02e49b spring-boot/spring-docker:1.0 "sh -c 'sh start.sh …" 7 minutes ago Up 7 minutes 0.0.0.0:7001->8080/tcp reverent_hugle
查看所有的容器
docker ps -a
查看 docker 状态
docker stats
查看容器IP
docker inspect [容器名称]
docker exec -it c7cd5b02e49b /bin/bash
c7cd5b02e49b:容器IDdocker logs -f -t --since="2020-08-27" --tail=10 c7cd5b02e49b
2020-08-27T02:43:51.470446811Z 2020-08-27 02:43:51.469 INFO embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:90) Tomcat initialized with port(s): 8080 (http)
2020-08-27T02:43:51.546234820Z 2020-08-27 02:43:51.545 INFO juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) Initializing ProtocolHandler ["http-nio-8080"]
2020-08-27T02:43:51.603181935Z 2020-08-27 02:43:51.602 INFO juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) Starting service [Tomcat]
2020-08-27T02:43:51.603988697Z 2020-08-27 02:43:51.603 INFO juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) Starting Servlet engine: [Apache Tomcat/9.0.21]
2020-08-27T02:43:51.846445791Z 2020-08-27 02:43:51.846 INFO juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) Initializing Spring embedded WebApplicationContext
2020-08-27T02:43:51.846863670Z 2020-08-27 02:43:51.846 INFO servlet.context.ServletWebServerApplicationContext.prepareWebApplicationContext(ServletWebServerApplicationContext.java:283) Root WebApplicationContext: initialization completed in 5125 ms
2020-08-27T02:43:52.483209108Z 2020-08-27 02:43:52.482 INFO scheduling.concurrent.ExecutorConfigurationSupport.initialize(ExecutorConfigurationSupport.java:171) Initializing ExecutorService 'applicationTaskExecutor'
2020-08-27T02:43:52.891167280Z 2020-08-27 02:43:52.890 INFO juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) Starting ProtocolHandler ["http-nio-8080"]
2020-08-27T02:43:52.970278450Z 2020-08-27 02:43:52.969 INFO embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:202) Tomcat started on port(s): 8080 (http) with context path ''
2020-08-27T02:43:52.977634872Z 2020-08-27 02:43:52.977 INFO springframework.boot.StartupInfoLogger.logStarted(StartupInfoLogger.java:59) Started SpringDockerApplication in 7.623 seconds (JVM running for 10.239)
--since:此参数指定了输出日志开始日期,即只输出指定日期之后的日志。-f:查看实时日志-t:查看日志产生的日期-tail=10:查看最后的10条日志c7cd5b02e49b容器ID停止容器
docker stop [容器ID]
停止所有容器
docker stop $(docker ps -a -q)
docker cp elasticsearch-sql-6.2.4.0.zip 905e762c9d0e:/root/
删除容器
docker rm [容器ID]
删除所有容器
docker rm $(sudo docker ps -a -q)
由于运行中的容器无法删除,这个命令也用于删除停止运行的容器
FROM centos
ADD jdk-8u152-linux-x64.tar.gz /java/
WORKDIR java
RUN mv jdk1.8.0_152 jdk
ENV JAVA_HOME=/java/jdk
ENV PATH=$PATH:$JAVA_HOME/bin
FROM:集成docker镜像ADD:添加本地文件到Docker镜像的java目录WORKDIR:切换docker目录RUN:运行 liunx 命令ENV:设置环境变量注意:jdk安装包需要和Dockerfile在同一目录
docker rmi 7cf6d64875c4
7cf6d64875c4:镜像ID
yum yum -y install python-pip
pip install docker-compose
查看安装的版本
docker-compose --version
卸载
pip uninstall docker-compose
如果 pip 比较慢则:
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com docker-compose
启动容器
docker-compose up
后台启动容器
docker-compose up -d
-f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定
docker-compose -f docker-compose.yml up -d
version: '3'
services:
es:
image: elasticsearch:7.9.0
container_name: es
restart: always
environment:
- "discovery.type=single-node"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /root/es/data:/usr/share/elasticsearch/data
- /root/es/logs:/usr/share/elasticsearch/logs
ports:
- 9200:9200
- 9300:9300
networks:
esnet:
aliases:
- esnet
networks:
esnet:
external: true
如果需要安装kibana等其他,需要创建一个网络,名字任意取,让他们在同一个网络,使得es和kibana通信
docker network create esnet
docker run --name es -d -p 9200:9200 -p 9300:9300 --network mysql-net --network-alias mysql -e "discovery.type=single-node" e47ebd7ec3ee
--name 名称 :给容器起个名字-p 外部访问端口:容器端口:9200是供htpp访问端口,9300是供tcp访问的端口,如果不做端口映射,浏览器就不能访问elasticsearch的服务--network 网络名:用于多个服务通信与隔离,例如用kibana连接elasticsearch就需要他们在同一个网络下e47ebd7ec3ee:通过docker images命令查看到需要创建的容器id,此处用镜像名也可以编写 docker-compose.yml 文件
version: '3.1'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
hostname: 192.168.1.1
container_name: es01
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es01:/usr/share/elasticsearch/data
- ./config/es01/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es01:/usr/share/elasticsearch/logs
ports:
- 9200:9200
- 9300:9300
networks:
esnet:
aliases:
- esnet
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
hostname: 192.168.1.2
container_name: es02
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es02:/usr/share/elasticsearch/data
- ./config/es02/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es02:/usr/share/elasticsearch/logs
depends_on:
- es01
networks:
esnet:
aliases:
- esnet
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
hostname: 192.168.1.3
container_name: es03
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es03:/usr/share/elasticsearch/data
- ./config/es03/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es03:/usr/share/elasticsearch/logs
depends_on:
- es01
networks:
esnet:
aliases:
- esnet
networks:
esnet:
external: true
version:指定 docker-compose.yml 的版本
V1 版本的 docker-compose.yml 只被支持到 docker-compose 1.6.x。再往后的 docker-compose 版本就不再支持 V1 版本的 docker-compose.yml
V1 版本的 docker-compose.yml 文件格式主要区别就是:
没有开头的 version 声明
没有 services 声明
不支持 depends_on
不支持命名的 volumes, networks, build arguments 声明
V2版本仅支持单机模式
V3版本支持单机模式也支持多机模式
services:多个容器集合,它有多个子集,该子集是自定义的容器。
image:指定服务所使用的镜像,如果本地不存在,拉取镜像
build:基于dockerfile文件构建镜像
container_name:容器名称
volumes:卷挂载路径
- 本地的目录名称:容器中的目录名称
volumes_from:从另一个服务或容器挂载其数据卷
volumes_from:
- service_name
- container_name
restart:always|no|on-failure| unless-stopped,3.7中已经被 restart_policy 代替。
no:no是默认的重启策略**,**在任何情况下都不会重启容器。
always:指定为always时,容器总是重新启动。
on-failure:如果退出代码指示出现故障错误,则on-failure将重新启动容器。
unless-stopped:unless-stopped 和 always 基本一样,只有一个场景 unless-stopped有点特殊:
如果容器正常stopped,然后机器重启或docker服务重启,这种情况下容器将不会被restart
restart_policy:配置是否以及如何在容器退出时重新启动容器。取代 restart。
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
environment:环境变量配置,可以用数组或字典两种方式
任何布尔值: true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False
如果服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。
将使用build的args子选项来定义构建时的环境变量。
depends_on:解决容器的依赖、启动先后的问题
depends_on:
-db
-redis
实例中先启动容器 db 和 redis 再启动 web,注意:web 服务不会等待 redis 和 db 「完全启动」之后才启动
ports:映射端口信息
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
expose :暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定容器内部的端口为参数。
extra_hosts:类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。
alias:别名。
dns:自定义DNS服务器,可以是一个值,也可以是一个列表。
dns_search:配置 DNS 搜索域,可以是一个值或列表。
entrypoint:类比dockerfile中的entrypoint。
command:覆盖容器启动后默认执行的命令。
env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量。
network:指定一个网络。
links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况。
docker pull kibana:7.9.0
docker run --name kibana -d -e ELASTICSEARCH_URL=http://127.0.0.1:9200 -p 5601:5601 5983f5fff662
version: '3'
services:
db:
image: mysql:5.7.21
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M;
ports:
- 3306:3306
volumes:
- /root/mysql/data:/var/lib/mysql
networks:
mysql-net:
aliases:
- mysql
networks:
mysql-net:
external: true
version: '3'
services:
redis:
image: redis
restart: always
volumes:
- redis:/data
mysql-net:
aliases:
- mysql
superset:
image: amancevice/superset
restart: always
depends_on:
- redis
environment:
MAPBOX_API_KEY: ${MAPBOX_API_KEY}
ports:
- "8088:8088"
dns:
- "8.8.8.8"
volumes:
- ./superset_config.py:/etc/superset/superset_config.py
mysql-net:
aliases:
- mysql
networks:
mysql-net:
external: true
volumes:
redis:
import os
MAPBOX_API_KEY = os.getenv('MAPBOX_API_KEY', '')
CACHE_CONFIG = {
'CACHE_TYPE': 'redis',
'CACHE_DEFAULT_TIMEOUT': 300,
'CACHE_KEY_PREFIX': 'superset_',
'CACHE_REDIS_HOST': 'redis',
'CACHE_REDIS_PORT': 6379,
'CACHE_REDIS_DB': 1,
'CACHE_REDIS_URL': 'redis://mysql:6379/1'}
SQLALCHEMY_DATABASE_URI = \
'mysql://root:123456@10.10.241.208:3306/superset?charset=utf8mb4'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KEY = 'thisISaSECRET_1234'
docker exec -it [容器名称] superset fab create-admin \
--username admin \
--firstname admin \
--lastname admin \
--email songyingguang@ky-tech.com.cn \
--password 123456
docker exec -it [容器名称] superset db upgrade
docker exec -it [容器名称] superset load_examples
docker exec -it [容器名称] superset init
yum remove docker-ce
rm -rf /var/lib/docker