欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

docker 笔记

程序员文章站 2022-05-03 15:10:04
整理一下 docker 的笔记。内容不多,便于速查。 docker 只是容器,并非虚拟机,很大程度上还得依赖宿主OS。 比如:镜像 microsoft/dotnet-framework就不能在Linux下运行,拉取时会有相应的提示。 相对来说,运行在Linux环境则稳定/高效,对Windows环境不 ......

整理一下 docker 的笔记。内容不多,便于速查。

docker 只是容器,并非虚拟机,很大程度上还得依赖宿主os。

比如:镜像 microsoft/dotnet-framework就不能在linux下运行,拉取时会有相应的提示。

docker 笔记

 

 

相对来说,运行在linux环境则稳定/高效,对windows环境不太好。并且windows需要开启 vt-x 或amd-v 指令才能使用。

 

1. 安装 (centos 7)

# 1. 检查有无安装docker
yum list installed |grep docker 

# 2. 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3. 添加软件源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 更新 yum 缓存
yum makecache fast

# 5. 安装docker
yum -y install docker-ce

# 6. 启动
systemctl start docker

# 7. 检查进程
ps -ef |grep docker

# 鉴于国内网络问题,后续拉取 docker 镜像缓慢,需要配置加速器,使用网易的镜像地址:http://hub-mirror.c.163.com
# 新版的 docker 使用 /etc/docker/daemon.json(linux)或者 %programdata%\docker\config\daemon.json(windows)来配置
# 在配置文件中加入(没有该文件的话,请先建一个):
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

# 删除 docker ce
yum remove docker-ce
rm -rf /var/lib/docker

 

2. 容器与镜像

## 容器与镜像的关系,好比编程中“对象”与“类”的关系

# ------------------------ docker cmd ----------------------------------
# 内部命令很多情况下,操作id或names都是一样的

docker       # 获取帮助

docker run hello-world    # 拉取并启动镜像

docker image ls          # 本地镜像
docker images            # 本地镜像

docker pull training/webapp  # 拉取某镜像

docker search redis          # 搜索镜像  official [ok] 为官方版本

docker pull ubuntu:13.10     # pull 或 run 也可以指定tag版本

# 使用镜像创建容器
docker run -d -p training/webapp python app.py   
#    -d:让容器在后台运行。
#    -p:将容器内部网络端口映射到主机随机端口上

docker ps               # 是否有容器在运行
#     ports 0.0.0.0:32768->5000/tcp 表示外部32768映射到容器内5000端口

# 也可以通过 -p 参数来指定ip和端口
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
# 随机生成容器名称。也可以 --name 指定名称
docker run -d -p 6379:6379 --name my_redis redis


# 可通过id或名称查看端口
docker port 98a243b215c7
docker port determined_bhabha

docker logs -f 98a243b215c7          # 应用程序日志

docker top 98a243b215c7              # 容器的进程

docker inspect determined_bhabha     # 容器配置和状态

docker stop determined_bhabha        # 停止应用容器
docker stop 98a243b215c7             # 或

docker ps -l                         # 查询最后一次创建的容器

docker start 98a243b215c7            # 再次启动容器
docker restart 98a243b215c7          # 重启容器

docker rm 98a243b215c7               # 删除容器 必须先stop
docker rmi 6fae60ef3446              # 删镜像 必先删对应容器,且只能用id

 

3. 几个应用示例:

##------------------------ docker redis --------------------------------
docker search redis
docker pull redis:3.2
docker images

docker run -p 6379:6379 -v /rdsdata:/data -d redis:3.2 redis-server --appendonly yes
# -v /rdsdata:/data : 将主机中/rdsdata挂载到容器的/data
# redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置

docker exec -it 6aa89bf8343a redis-cli  # 进入redis cli
> info
> config get *

##------------------------ docker nginx --------------------------------
# 1. 拉取并测试启动
docker pull nginx
docker run --name dk_nginx -p 80:80 -d nginx

# 2. 创建映射目录
mkdir -p /nxdata/logs /nxdata/conf /nxdata/www
# www: 目录将映射为 nginx 容器配置的虚拟目录。
# logs: 目录将映射为 nginx 容器的日志目录。
# conf: 目录里的配置文件将映射为 nginx 容器的配置文件。

# 3. 编辑并保存配置文件
docker ps 
docker cp dk_nginx:/etc/nginx/nginx.conf /nxdata/conf/ 
# 拷贝容器内 nginx 默认配置文件到本地的 conf 目录, 编辑内容如下:
    user  nginx;
    worker_processes  1;

    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;
        keepalive_timeout  65;
        #gzip  on;
        include /etc/nginx/conf.d/*.conf;
    }


# 4. 重新部署
docker stop dk_nginx
docker rm dk_nginx  # 停止并删除旧容器

docker run -d -p 80:80 --name mynginx -v /nxdata/www:/usr/share/nginx/html \
  -v /nxdata/conf/nginx.conf:/etc/nginx/nginx.conf \
  -v /nxdata/logs:/var/log/nginx nginx
#    -v /nxdata/www:/usr/share/nginx/html    将创建的 www 目录挂载到容器的 /usr/share/nginx/html
#    -v /nxdata/conf/nginx.conf:/etc/nginx/nginx.conf   将创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf
#    -v /nxdata/logs:/var/log/nginx    将创建的 logs 挂载到容器的 /var/log/nginx

# 5. 在 /nxdata/www 下放入index.html文件后,浏览器访问测试

docker kill -s hup mynginx     # 重新载入 nginx (status 不变)
docker restart mynginx         # 重启 nginx 容器 (status 重新开始)


# ------------------------- docker php ---------------------------------
# 1. 拉取镜像
docker pull php:5.6-fpm

# 2. 先启动 php-fpm
docker run --name myphp -d -v /nxdata/www:/var/www/html:ro php:5.6-fpm
# /nxdata/www是本地 php 文件的存储目录,/var/www/html是容器内 php文件目录,ro 表只读

# 3. 添加本地配置文件/nxdata/conf/conf.d/default.conf 内容如下:
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index index.html index.htm index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  script_filename  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
}


# 4. 启动nginx并连接php
docker run --name mynginx -p 81:80 -d \
  -v /nxdata/www:/usr/share/nginx/html:ro \
  -v /nxdata/conf/conf.d:/etc/nginx/conf.d:ro \
  --link myphp:php nginx
# --link myphp:php 把 myphp 的网络并入mynginx , 并通过修改 mynginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm

# 5. 添加/nxdata/www/index.php文件并测试访问 http://host:81/
<?php
    phpinfo();


# ------------------------- docker mariadb -------------------------------
docker pull mariadb:5.5.64
# tag可以在hub.docker.com中点击项目后查看

# 1. 创建本地映射目录
mkdir -p /nxdata/mariadb/data /nxdata/mariadb/logs /nxdata/mariadb/conf

# 2. 配置文件 /nxdata/mariadb/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_file_per_table=1
innodb_buffer_pool_size = 1g

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

# 3. 启动容器
docker run -p 3306:3306 --name maria -v /nxdata/mariadb/conf:/etc/mysql/conf.d \
  -v /nxdata/mariadb/logs:/logs -v /nxdata/mariadb/data:/data \
  -e mysql_root_password=123456 -d --link myphp mariadb:5.5.64  
#    -v /nxdata/mariadb/conf:/etc/mysql/conf.d 挂载配置文件(容器中路径不对则不生效)
#    -e mysql_root_password=123456  初始化 root 用户的密码

# 4. 使用cli连接  也可以使用工具连接(如navicat)
docker run -it --link maria:mariadb mariadb:5.5.64 sh -c 'exec mysql -hmaria -p3306 -uroot -p123456'
#   --link 连接到容器maria并命名为mariadb  后跟镜像名
#   sh -c 用来执行命令

# 测试sql命令:show variables like '%per_table%';   show databases;

# 如果需要,也可以安装使用 phpmyadmin
docker run --name myadmin -d --link maria:db -p 82:80 phpmyadmin/phpmyadmin
# 测试访问 http://host:82/


# ------------------------ docker mongodb ------------------------------
docker search mongo
docker pull mongo

# 目录如果没有会自动创建
docker run -p 27017:27017 -v /nxdata/mongodb:/data/db -d mongo

docker run -it mongo mongo --host 172.17.0.1    # shell