Docker 实战指南

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
  1. 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

你可能感兴趣的:(docker,centos,linux,java,python)