docker操作详解
docker操作详解
docker操作
1. 基本命令
命令 | 说明 |
---|---|
docker version | 显示 Docker 版本信息 |
docker info | 显示 Docker 系统信息,包括镜像和容器数 |
docker search | 从 Docker Hub 中搜索符合条件的镜像 |
docker pull | 从 Docker Hub 中拉取或者更新指定镜像 |
docker images | 列出本地所有镜像 |
docker ps | 查看正在运行的容器 -a 查看所有的容器 -q 仅列出容器ID |
docker rmi | 删除本地镜像 -f 强行移除该镜像,即使其正被使用 |
docker rm docker rm -f $(docker ps -aq) | 删除容器 强行移除该容器,即使其正在运行 删除全部容器 |
docker history | 查看指定镜像的创建历史 |
docker start|stop|restart | 启动、停止和重启一个或多个指定容器 -i 启动一个容器并进入交互模式 |
docker kill | 杀死一个或多个指定容器进程 |
docker run | 从镜像中运行一个新实例 -d 后台运行容器,并返回容器ID -i 以交互模式运行容器,通常与 -t 同时使用 -t 为容器重新分配一个伪输入终端 –name=“nginx-lb” 为容器指定一个名称 |
docker stop | 从镜像中停止一个实例 |
docker top | 查看一个正在运行容器进程 |
docker inspect | 检查镜像或者容器的参数,默认返回 JSON 格式 |
docker push | 将镜像推送至远程仓库,默认为 Docker Hub |
docker logs | 获取容器运行时的输出日志 -f 跟踪容器日志的最近更新 -t 显示容器日志的时间戳 –tail=“10” 仅列出最新10条容器日志 |
docker exec | 进入docker容器 -d 以后台方式执行命令 -i,交互模式 -t,设置TTY |
docker build | 构建镜像 -t 镜像的名字及标签 |
2. dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像 。
2.1 dockerfile命令
命令 | 说明 |
---|---|
FROM | 指定基础镜像, FROM命令必须是Dockerfile的首个命令 如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像 |
MAINTAINER | 声明作者 |
WORKDIR | 设置CMD指明的命令的运行目录 |
COPY | 文件复制 |
ADD | 文件复制,比COPY更高级,源路径可以是一个URL,如果源是一个URL,那该URL的内容将被下载并复制到容器中 。 例:ADD /my_app_folder /my_app_folder |
ENV | 设置环境变量 |
RUN | 接受命令作为参数并用于创建镜像 |
USER | 设置运行容器的UID |
CMD | 用于指定在容器启动时所要执行的命令 例:CMD “echo” “Hello docker!” |
VOLUME | 在镜像中创建挂载点 ,用于让你的容器访问宿主机上的目录 |
ENTRYPOINT | 和CMD类似,用于配置容器启动后执行的命令,不同的是不可被 docker run 提供的参数覆盖 ;且docker run命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT ;每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效 |
ONBUILD | 用于设置镜像触发器 |
EXPOSE | 暴露端口,使容器内的应用可以通过端口和外界交互 |
2.2 hello dockerfile
1) 编写dockerfile
# 1、第一行必须指定基础镜像信息
FROM docker.io/alpine
# 2、维护者信息
MAINTAINER dacai
# 3、容器启动执行指令
CMD echo "hello docker!"
2) 构建镜像
命令最后有一个 . 表示当前目录
docker build -t hello_docker .
3) 测试
查看镜像
docker images
运行
docker run hello_docker
2.3 构建nginx镜像
1) 编写dockerfile
FROM docker.io/ubuntu
MAINTAINER dacai
RUN apt-get -y update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80
2) 构建镜像
docker build -t dacai/nginx .
3) 测试
docker run -d -p 8888:80 --name mynginx dacai/nginx
2.4 构建web应用镜像
这里以基于springboot生成的jar为例
1) 编写dockerfile
FROM java
MAINTAINER dacai
ADD app.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
2) 构建镜像
docker build -t dacai/hello .
3) 测试
docker run -p 8888:8080 --name hello dacai/hello
然后可以在浏览器中测试web功能
2.5 镜像分层
2.6 原则与建议
- 容器轻量化。从镜像中产生的容器应该尽量轻量化,能在足够短的时间内停止、销毁、重新生成并替换原来的容器。
- 使用
.gitignore
。在大部分情况下,Dockerfile 会和构建所需的文件放在同一个目录中,为了提高构建的性能,应该使用.gitignore
来过滤掉不需要的文件和目录。 - 为了减少镜像的大小,减少依赖,仅安装需要的软件包。
- 一个容器只做一件事。解耦复杂的应用,分成多个容器,而不是所有东西都放在一个容器内运行。如一个 Python Web 应用,可能需要 Server、DB、Cache、MQ、Log 等几个容器。一个更加极端的说法:One process per container。
- 减少镜像的图层。不要多个 Label、ENV 等标签。
- 对续行的参数按照字母表排序,特别是使用
apt-get install -y
安装包的时候。 - 使用构建缓存。如果不想使用缓存,可以在构建的时候使用参数
--no-cache=true
来强制重新生成中间镜像。
3. Docker Compose
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
Compose 中有两个重要的概念:
- 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
3.1 Docker Compose 安装
1) 下载compose版本
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
如下载太慢切换到国内
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2) 添加执行权限
chmod +x /usr/local/bin/docker-compose
3) 下载命令补全工具
curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
4) 测试
docker-compose --version
5) 常用命令
docker-compose build # 构建镜像
docker-compose up # 构建镜像并启动服务
docker-compose stop # 停止服务
docker-compose down # 停止并移除容器
3.2 搭建MySql
1) 下载MySql镜像
docker pull mysql
2) 编辑docker-compose.yml
version: '3' # compose命令版本
services: # 服务
mysql: # 服务名称,自定义
restart: always
image: docker.io/mysql # 镜像名称
container_name: mysql # 容器名称,自定义
ports:
- '3306:3306' # 端口映射
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: root
MYSQL_PASSWORD: 123456
volumes: # 挂载一个目录或者一个已存在的数据卷容器
- ./data:/var/lib/mysql
command: # 覆盖容器启动后默认执行的命令
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
privileged: true # CentOS7中的安全模块selinux把权限禁掉了
3) 启动
docker-compose up
|
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --privileged=true --name mysql57 mysql:5.7
注:3306:3306 宿主机端口=>容器端口
docker run -d -p 3308:3306 \
-v ~/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
--name mysql577 \
mysql:5.7
可重启测试数据持久化
4) 客户端连接问题
比如sqlyog工具连接不上,可以尝试如下操作
-
进入mysql容器
docker exec -it 【容器id】 bash
-
连接mysql
mysql -uroot -p
alter user 'root'@'localhost' identified with mysql_native_password by '123456'; alter user 'root'@'%' identified with mysql_native_password by '123456';
3.3 编排web应用
1) jar
可以利用maven构建项目jar包
注意 :jar包构建的springboot工程application.yml
中,mysql的连接方式使用mysql的镜像名而不是ip 。
2) web应用dockerfile
FROM java
MAINTAINER dacai
ADD hello.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
3) 编辑docker-compose.yml
version: '3' # compose命令版本
services: # 服务
web:
build: ./web
container_name: web
ports:
- '8899:8080'
depends_on:
- mysql
mysql: # 服务名称,自定义
restart: always
image: docker.io/mysql # 镜像名称
container_name: mysql # 容器名称,自定义
ports:
- '3306:3306' # 端口映射
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: root
MYSQL_PASSWORD: 123456
volumes: # 挂载一个目录或者一个已存在的数据卷容器
- ./data:/var/lib/mysql
command: # 覆盖容器启动后默认执行的命令
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
privileged: true # CentOS7中的安全模块selinux把权限禁掉了
4) 启动
docker-compose up
4. volume
Docker 采用 volume (卷)的形式来向容器提供持久化存储。
默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。
一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。
如下列举几种方式来使用 data volume:
1) 使用 “-v 容器内目录” 形式
docker run -d -p 80:80 --name mynginx -v /var/www/html --privileged=true dacai/nginx
然后使用 docker inspect 命令找到Docker 将本地一个 _data 目录 mount 为容器内的 /var/www/html目录了 。
在 web 容器被删除后,_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。 故不推荐。
2) 使用 -v 来挂载一个主机上的目录到容器的目录
–privileged=true 设置挂载的目录权限
docker run -d -p 80:80 --name mynginx -v $PWD/html:/var/www/html --privileged=true dacai/nginx
重新启动容器时,可以再次使用同样的方式来将$PWD/html目录挂载到新的容器内,这样就可以实现数据持久化的目标
3) 使用 docker volume 命令
Docker 新版本中引入了 docker volume 命令来管理 Docker volume 。
-
使用默认的 ‘local’ driver 创建一个 volume
docker volume create --name vol1
docker volume inspect vol1
-
使用这个 volume
docker run -d -p 80:80 --name mynginx -v vol1:/var/www/html --privileged=true dacai/nginx
更多推荐
所有评论(0)