Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
手动将某个容器加入网桥
docker network connect my-bridage test2
查看网络信息
docker network ls
查看 Docker 容器具体信息
docker inspect mysql5.7
docker 容器文件存储位置
# Linux
/var/lib/docker/containers
防止无法使用 service
docker run -itd --privileged --name leon-nginx centos /usr/sbin/init
docker exec -it myCentos /bin/bash
创建 leon-elasticsearch 环境
docker run \
--name leon-elasticsearch \
-p 9200:9200 \
-p 9100:9100 \
-p 5601:5601 \
--network esnet \
-d leon-elasticsearch:v0.5 \
/usr/sbin/init
创建 leon-ai-php 环境
docker run \
--name leon-ai-php \
-p 9000:80 \
-p 9001:3306 \
-p 9002:6379 \
-v /mnt/hgfs/share/leon-ai-api-php:/usr/share/nginx/html \
--privileged=true \
-d leon-ai-php:v1.0 \
/usr/sbin/init
连接到容器
docker exec -it leon-ai-php /bin/bash
容器自启动
# 网上有些文章说,要让docker 的容器自动在开机启动,是写脚本,比如在 rc.local 中写。
# 其实完全没必要这么麻烦,docker 有相关指令,docker run 指令中加入 --restart=always 就行。
sudo docker run --restart=always 容器ID
# 如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always 容器ID
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
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: 绑定一个卷
$ docker ps // 查看所有正在运行容器
$ docker stop containerId // containerId 是容器的ID
$ docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID
$ docker stop $(docker ps -a -q) // stop停止所有容器
$ docker rm $(docker ps -a -q) // remove删除所有容器
# 删除镜像
$ docker rmi imageId
$ docker start dnmp_php
$ docker start dump_nginx
启动 systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker
查看所有正在运行容器
docker ps
删除容器
docker rm id/name
查看本地镜像
docker images
删除镜像
docker rmi id/name
复制文件
1.从宿主机拷贝文件到容器,在宿主机终端运行命令:
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp /Users/leon/Downloads/elasticsearch-7.11.1-linux-x86_64.tar.gz leon-elasticsearch:/opt/elasticsearch-7.11.1-linux-x86_64.tar.gz
2.将容器里的文件拷贝到宿主机,在宿主机终端运行命令:
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
查看镜像历史提交记录
docker history centos-python:1.0.0
查看 docker 统计
docker stats
保存容器为镜像
docker commit -a "Leon Xu" -m "0.3" f3350687cb1b leon-ai-php:v1.0
docker commit -a "Leon Xu" -m "MariaDB、Nginx、Redis、PHP73" 3fbd91000164 leon-ai-php:v1.1
docker commit -a "Leon Xu" -m "Set start up onload" 29f5250317a6 leon-elasticsearch:v0.5
# 参数说明
# -a :提交的镜像作者;
# -c :使用Dockerfile指令来创建镜像;
# -m :提交时的说明文字;
# -p :在commit时,将容器暂停。
保存镜像为文件
docker save -o leon-ai-php-v1.0-docker-iso.tar leon-ai-php:v1.0
装载文件为镜像
docker load -i leon-ai-php.tar
配置镜像加速器加速下载
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tnxkcso1.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
创建 Centos 容器
docker run -v /Users/leon/Developer/docker/OpenGL:/home -itd --name opengl centos:7.8.2003 /bin/bash
docker run -v /Users/leon/Developer/docker/wxunpkg:/home -itd --name opengl centos:7.2.1511 /bin/bash
docker run -v /Users/leon/Developer/docker/ffcreator:/home -itd --name FFCreator centos:7.2.1511 /bin/bash
Centos 容器下安装其它软件
yum -y install epel-release gcc
# 安装 supervisorctl
yum -y install supervisor
# 安装 Python
yum repolist
yum -y install python36
# CentOS 8.x
yum -y install platform-python-devel.x86_64
# 升级
pip3 install --upgrade pip
# 更换 pip3 源为阿里云源
pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
python3 -V
pip3 -V
# 安装 Nginx
yum install -y nginx
创建 MySQL 容器
宿主机的 6001 映射到 3306,密码设置为 Leon@1213,不能设置`等符号
docker run \
--name tencent-mysql \
-p 6001:3306 \
-e MYSQL_ROOT_PASSWORD=**** \
-v /home/docker/mysql/conf:/etc/conf/mysql \
-v /home/docker/mysql/logs:/var/log/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci \
--default-time_zone='+8:00'
docker run \
--name leon-mysql-5.7 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD='1234a`' \
-v /Users/leon/Developer/docker/leon-mysql-5.7/conf:/etc/conf/mysql \
-v /Users/leon/Developer/docker/leon-mysql-5.7/logs:/var/log/mysql \
-v /Users/leon/Developer/docker/leon-mysql-5.7/data:/var/lib/mysql \
-d mysql:5.7.28 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci \
--default-time_zone='+8:00'
创建 Redis 容器
sudo docker run -itd --name tencent-redis -p 6101:6379 redis:5.0.8
创建 Node 容器
sudo docker run -itd --name tencent-node -p 7001:7001 -v /home/docker/leon-ai/api:/home/leon-ai/api node:12.18.2-stretch-slim
创建 PHP 容器
FROM php:7.3-fpm AS php7.3
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN docker-php-ext-install mysqli pdo pdo_mysql gd \
&& pecl install redis-5.0.0 \
&& pecl install yaf-3.0.8 \
&& pecl install xdebug-2.7.2 \
&& docker-php-ext-enable redis xdebug yaf \
&& cd /usr/local/etc/php \
&& touch php.ini
docker build -t php7.3 .
docker run \
--name tencent-php \
-p 6201:9000 \
-v /home/www/leon-ai-api-php:/var/www/html \
-d php7.3
dock
创建 RabbitMQ 容器
# 拉取 RabbitMQ Images,新手推荐使用; `rabbitmq:management`
docker pull rabbitmq:management
docker run -dit \
--name Myrabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq:managemen
# 15672 是 Web 网页管理界面,可以通过 http://localhost:15672 查看。
# 5672 是 RabbitMQ 通讯端口,用户名、密码均为 admin(请自定义)。
使用 Dockerfile 构建镜像
docker build -f /var/nginx_build/Dockerfile .
快速安装 docker-compser
链接
docker-compose.yml的使用
docker-compose.yml包含version、services、networks3大部分
services的书写规则
services:
web: # 服务名称,用户自定义
image: busybox # 镜像名称/镜像ID,如果本地不存在compose会拉取镜像
images: redis
images: mysql:latest
images: example-registry.com:4000/postgresql
2.build-------基于Dockerfile,指定Dockerfile所在路径,Compose会利用它自动构建镜像,然后启动服务容器
# 绝对路径
build: /path/build
\# 相对路径
build:./build
\# 设定上下文跟目录,以此目录指定Dockerfile
build:
context: ../
dockerfile: path/Dockerfile
\# 给Dockerfile构建的镜像命名
build: ./dir
images: nginx:latest
\# 构建过程中指定环境变量,构建成功后取消
build:
context: .
args:
buildno: 1
password: secret
or
build:
context: .
args:
\- buildno=1
\- password=secret
\##与ENV不同,ARG允许空值
3.command-------覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
or 写成dockerfile的格式
command: [bundle, exec, thin, -p, 3000]
4.container_name-----容器名称
container_name: app
5.depends_on-------容器依赖
# 基于redis和db服务启动web服务
version: '2'
services:
web:
build: .
depends_on:
\- db
\- redis
redis:
image: redis
db:
image: postgres
6.dns --------
dns: 8.8.8.8
or
dns:
\- 8.8.8.8
\- 9.9.9.9
dns_search: example.com
dns_search:
\- xxxx
\- xxxx
- tmpfs--------挂在临时目录到容器内部,与run参数效果一致
tmpfs: /run
tmpfs:
\- /run
\- /tmp
8.entrypoint--------覆盖Dockerfile中ENTRYPOINTmingling
entrypoint: /code/entrypoint.sh
\#
entrypoint:
\- php
\- -d
9.env_file--------指定配置文件,设置compose的变量(可通过docker-compose -f FILE指定配置文件)
env_file: .env
\# 若与environment指令冲突,以后者为准
\# 可设置多个
env_file:
\- ./xx.env
\- xx.env
\# 此变量不对build构建过程生效
10.environment--------设置镜像变量,启动后的容器会包含这些变量设置
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
\- RACK_ENV=development
\- SHOW=true
\- SESSION_SECRE
11.external_links-------------让compose项目里面的容器链接到项目配置外部的容器(外部容器中必须至少有一个容器链接到项目内服务的同一个网络里)
external_links:
\- redis_1
\- project_db_1:mysql
\- project_db_1:postgresql
12.exra_hosts-----------添加主机名标签(向/etc/hosts文件中添加纪录)
extra_hosts:
\- "mysql:ip"
\- "nginx:ip"
\# 启动容器后查看内部hosts
ip mysql
ip nginx
13.links-----------链接到其它服务器中的容器
links:
\- db
\- db:mysql
\- redis
\# 使用的别名会自动在容器的/etc/hosts里创建
ip db
ip mysql
ip redis
14.logging--------配置日志服务
logging:
driver: syslog
options:
syslog-address: "tcp://ip"
\# 默认的dirver是json-file,可通过docker-compose logs显示日志
15.ports---------映射端口(HOST:CONTAINER)
ports:
\- "3000"
\- "8000:80"
\- "2222:22"
\- "127.0.0.1:8080:8080"
16.volumes-------挂载一个目录或者已经存在的数据卷容器(HOST:CONTAINER/HOST:CONTAINER:ro,后者设定数据卷只读,可保护宿主机器的文件系统)
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
\- /var/lib/mysql
// 使用绝对路径挂载数据卷
\- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
\- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
\- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
\- datavolume:/var/lib/mysql
\# 从其他容器或者服务挂在数据卷
volumes_from:
\- service_name
\- service_name: ro
\- container: container_name
\- container: container_name:rw
17.network_mode-------网络模式:
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
18.networks----------加入指定网络
services:
some-service:
networks:
\- some-network
\- other-network
docker compose 常用命令
docker-compose up -d # 在后台启动服务
docker-compose ps # 查看启动的服务
docker-compose stop #停止服务
\#查看帮助
docker-compose -h
\# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
\#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d
\#停用移除所有容器以及网络相关
docker-compose down
\#查看服务容器的输出
docker-compose logs
\#列出项目中目前的所有容器
docker-compose ps
\#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
\#拉取服务依赖的镜像
docker-compose pull
\#重启项目中的服务
docker-compose restart
\#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm
\#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com
\#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2
\#启动已经存在的服务容器。
docker-compose start
\#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop
问题集锦
Q:System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
解决方法:
docker run -itd --privileged --name myCentos centos /usr/sbin/init
创建完成后: 请使用以下命令进入容器
docker exec -it myCentos /bin/bash
原因:
默认情况下,在第一步执行的是 /bin/bash
,而因为docker
中的bug
,无法使用systemctl
,所以我们使用了/usr/sbin/init
同时 --privileged
这样就能够使用systemctl
了,但覆盖了默认的/bin/bash
,因此我们如果想进入容器就不能再使用。
Docker 安装
腾讯云 Centos 安装部署
yum 安装方式 一
下载软件源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
安装
yum install docker-ce -y
启动
systemctl enable docker
systemctl start docker
yum 安装方式 二
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务:
sudo systemctl start docker
sudo systemctl enable docker
get docker 安装方式
更新yum包
sudo yum update
执行 Docker 安装脚本,这个脚本会添加 docker.repo 源并安装 Docker。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
启动 Docker 进程
sudo systemctl start docker
sudo systemctl enable docker
测试
测试运行 hello-world:
docker run hello-world