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
镜像中心
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 > // 使用其他容器的网络,共享
IP和PORT等网络资源 - none 容器使用自己的网络(类似
--next=bridge),但是不进行配置
- 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
- 博客园 · docker 系统学习之 docker 界面管理 · 老梁讲 Java
- Github · Portainer
- Docker 图形化管理工具之 Portainer
- Docker 管理面板 Portainer 中文汉化项目
附录
镜像加速
安装
参考:
- GitHub · some personally made dockerfile - Dockerfile 开源库
- 课程介绍,Docker 入门教程 · 慕课网 - 视频
- CSDN · lfendo - Docker 专栏 · CSDN