跳到主要内容

Docker 基础

介绍

docker 一词的原意为“码头的装卸工”。 Docker 是一个基于 Golang 语言开发的开源的应用容器引擎,可以让开发者打包应用及其依赖到一个轻量级、可移植的容器中, 然后发布到任何流行的 Linux 服务器。使用容器部署应用程序称为容器化。主要解决“在我的机器上正常运行、但到你的机器上不正常运行”的问题。

安装

CentOS 中安装 Docker-CE

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。
# 例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

CentOS 镜像加速 阿里云

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://sly207as.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

常用命令

基础命令

docker pull # 获取image
docker build # 创建image
docker images # 列出image -a 列出所有
docker run # 运行container > docker run -p 80:80 --name wn-nginx $PWD/html:/usr/share/nginx/html nginx
docker ps # 列出container 等同 `docker container ls`
docker rm # 删除container

docker rmi # 删除image
docker cp # 在host和container之间拷贝文件
docker commit # 保存改动为新的image
查看所有docker容器
> docker ps -a
查看所有docker容器ip
> docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

其他命令

# 停止所有容器
> docker stop $(docker ps -q)

> docker stop `docker ps -q`

# 删除所有容器
> docker rm $(docker ps -a -q)

> docker rm `docker ps -a -q`

# 删除所有镜像
> docker rmi $(docker images -q)

# 删除所有未运行的容器
> docker container prune

# 删除所有未挂载的镜像
> docker image prune

# 删除所有未使用的镜像
> docker image prune -a

# 删除所有未使用的卷
> docker volume prune

镜像中心

阿里云

DaoCloud

网易云

腾讯云


2.Dockerfile 语法

```yml
FROM # base image
RUN # 执行命令
ADD # 添加文件
COPY # 拷贝文件
CMD # 执行命令
EXPOSE # 对外暴露接口

WORKDIR # 指定路径
MAINTAINER # 维护者
ENV # 设定环境变量
ENTRYPOINT # 容器入口
USER 指定用户
VOLUME # mount point(指定容器所指定的卷)
docker run 参数

命令格式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

通过 run 命令创建一个新的容器(container)

  • 常用选项
    • -d, --detach=false,指定容器运行于前台还是后台,默认为 false
    • -i, --interactive=false,打开 STDIN,用于控制台交互
    • -t, --tty=false,分配 tty 设备,该可以支持终端登录,默认为 false
    • -u, --user="",指定容器的用于
    • -a, --attach=[],指定容器(必须是已 docker run -d 启动的容器)
    • -w, --workdir="",指定容器的工作目录
    • -c, --cpu-shares=0,设置容器 CPU 权重,在 CPU 共享场景使用
    • -e, --env=[],指定环境变量,容器中可以使用该环境变量
    • -m, --memory="",指定容器的内存上限
    • -P, --publish-all=false,指定容器暴露的端口
    • -p, --publish=[],指定容器暴露的端口
    • -h, --hostname="",指定容器的主机名
    • -v, --volume=[],给容器挂载存储卷,挂载到容器的某个目录
    • --volumes-from=[],给容器挂载其他容器的卷,挂载到容器的某个目录
    • --cap-add=[],添加权限,权限清单详见#
    • --cap-drop=[],删除权限,权限清单详见#
    • --cidfile="",运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法
    • --cpuset="",设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU
    • --device=[],添加主机设备给容器,相当于设备直通
    • --dns=[],指定容器的 dns 服务器
    • --dns-search=[],指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件
    • --entrypoint="",覆盖 image 的入口点
    • --env-file=[],指定环境变量文件,文件格式为每行一个环境变量
    • --expose=[],指定容器暴露的端口,即修改镜像的暴露端口
    • --link=[],指定容器间的关联,使用其他容器的 IP、env 等信息
    • --lxc-conf=[],指定容器的配置文件,只有在指定 --exec-driver=lxc 时使用
    • --name="",指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字
    • --net="bridge",容器网络设置:
      • bridge // 使用 docker daemon 指定的网桥
      • host // 容器使用主机的网络
      • container:NAME_or_ID > // 使用其他容器的网络,共享 IPPORT 等网络资源
      • none 容器使用自己的网络(类似--next=bridge),但是不进行配置
    • --privileged=false,指定容器是否为特权容器,特权容器拥有所有的 capabilities
    • --restart="no",指定容器停止后的重启策略:
      • no:容器退出时不重启
      • on-failure:容器故障推出(返回值非零)时重启
      • always:容器退出时总是重启
    • --rm=false,指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    • --sig-proxy=true,设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理

实例:

# 运行一个在后台执行的容器,同时,还能用控制台管理:
docker run -i -t -d ubuntu:latest

# 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:
docker run -d ubuntu:latest ping www.docker.com

# 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,
docker run -d --restart=always ubuntu:latest ping www.docker.com

# 为容器指定一个名字,
docker run -d --name=ubuntu_server ubuntu:latest

# 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),
docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest

# 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),
docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest

常用的 image

docker 中运行 centos

# 下载
docker pull centos
# 运行
docker run -it --name wn-centos centos /bin/bash
# 进入已经运行的容器
docker exec -it wn-centos /bin/bash

# 查看配置文件
docker inspect wn-centos

docker 中运行 mysql

# 下载
docker pull mysql:5.7
# 运行
docker run --name wn-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# 持久化运行
docker run --name wn-mysql -p 3306:3306 -v /srv/data/mysql:/var/lib/mysql -v /opt/conf.d/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker 中运行 redis

安装、运行

# 下载
docker pull redis
# 持久化运行
docker run --name wn-redis -p 6379:6379 -v /srv/data/redis:/data -v /opt/conf.d/redis/redis.conf:/etc/redis/redis.conf --restart=always --log-opt max-size=50m --log-opt max-file=5 -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456

测试本地连接

# 进入容器
docker exec -it wn-redis bash # 使用容器名以交互方式进入容器内部
docker exec -it b066 base # 使用容器Id以交互方式进入容器内部

# 执行命令
/data# redis-cli
127.0.0.1:6379> auth 123456 # 输入设置的密码
OK
127.0.0.1:6379> set k1 '123' # 设置k1值为123
ok
127.0.0.1:6379> get k1 # 获取k1的值
"123"
127.0.0.1:6379> del k1 # 删除k1
(integer) 1
修改自动启动
# 修改自动启动
docker update --restart=always wn-mysql

# 取消自动启动
docker update --restart=no 9fafbcba58b0

docker 中运行 nginx

# 下载
docker pull nginx

# 持久化运行
docker run --name wn-nginx -v /opt/conf.d/nginx:/etc/nginx/conf.d -v /srv/data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /srv/data/nginx/html:/usr/share/nginx/html -v /var/log/nginx:/var/log/nginx -itd nginx /bin/bash
docker run --name wn-nginx -d -p 80:80 -v /srv/data/nginx/html:/usr/share/nginx/html -v /srv/data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/conf.d/nginx:/etc/nginx/conf.d -v /var/logs/nginx:/var/log/nginx nginx

docker 中运行 nps

安装、运行

# 下载-服务端使用
docker pull ffdfgdfg/nps
# 持久化运行
docker run --name wn-nps -v /srv/docker/volumn/nps/conf:/conf -d --net=host ffdfgdfg/nps

# 下载-客户端使用
docker pull ffdfgdfg/npc
# 运行
docker run --name wn-npc --net=host -server=10.1.10.9:8024 -vkey=5aJc24Dd -d ffdfgdfg/npc
# 上边可能会出现 unknown shorthand flag: 's' in -s= ,改用下边方式
docker run -d --name npc --net=host ffdfgdfg/npc -server=ip地址:8024 -vkey=验证密钥 -type=tcp

docker 中运行 gitea

安装、运行

# 下载
docker pull gitea/gitea:latest

docker run -d -p 3000:3000 --name wn-gitea --restart always -v /srv/gitea:/data gitea/gitea:latest

docker 中运行 portainer

项目地址

安装、启动

# 下载
docker pull portainer/portainer
# 持久化运行
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

docker 中运行 wordpress

docker pull wordpress:latest

docker run --name wn-wordpress -p 8800:80 -v /srv/wordpress/:/var/www/html -d --restart=always wordpress:latest

附录


镜像加速

安装

参考: