【Docker】入门



2018年07月16日    Author:Guofei

文章归类: 0x11_算法平台    文章编号: 141

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2018/07/16/docker.html


注:

  • docker中,同一功能的命令往往有多种,这里只列出某一风格的命令,原则是好记,不要在意茴香豆有几种写法。例如,用 docker image rm [镜像名] 删除镜像,而不是 docker rmi [镜像名]
  • docker 命令设计的非常好,以至于这篇文章可以很简介,例如,以下所有用到 container_id 的地方,都可以换成 container_name; 所有用到 image_id 的地方,都可以换成 image_name

简介

Docker三个基本概念

  1. Image:一组文件,分层构建
  2. Container:是Image的一个实例,有自己的root/网络/进程,和 Image 的关系如同类和对象的关系
  3. Repository:存储、分发 Image 的服务(例如 dockerhub https://hub.docker.com/)。一个 Docker Registry 中包含多个 Repository,每个 Repository 包含多个 Tag ,每个 Tag 包含一个镜像。

相关网站

容器的使用

建立一个容器

docker run -it ubuntu bash
# 若本地没有该镜像,则从远端下载
docker run hub.c.163.com/library/hello-world:latest
docker run -it ubuntu:14.04 /bin/bash
docker run -it --name="my-container-name" --volume /Users/guofei/git/:/Users/guofei/git/ ubuntu bash
  • -it 一般连在一起用。i表示让容器的标准输入保持打开,t表示让Docker分配一个伪终端并绑定到容器标准输入上
  • -d 后台运行容器
  • --rm 退出时清除文件系统
  • --name="my-container-name" 指定一个名称
  • --volume /Users/guofei/git/:/Users/guofei/git/ 挂载目录
  • -p 127.0.0.1:4006:4000 端口映射

查看容器

# 列出正在运行的容器
docker container ls

# 列出所有容器(包括Exited)
docker container ls -a

启用已经终止的 container

docker container start your_container_id

进入容器

docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# -d 让Docker 后台运行,而不是直接将结果输出到当前宿主机下
# 会返回一个id
docker container logs <id or container_id or name> # 用来查看返回的信息
docker attach <id or container_id or name> # 对于后台运行的容器,进入容器(进去之后还在print)
docker exec -it <container_id or name> bash # 同样是进入容器(进去之后不显示print的内容,但后台还是一直在print)
# docker start [CONTAINER_ID or CONTAINER_NAME]

停止容器

docker stop your_container_id

# 停止所有运行中的容器
docker stop $(docker ps -q)

删除容器

docker container rm <container id>
docker container rm -f <name> # -f 删除运行中的 container
docker container prune # 清除所有 终止状态的 container

# 删除所有容器
docker container rm $(docker container ls -aq)
# 删除所有容器,包括 running 状态的
docker container rm -f $(docker container ls -aq)

容器改名

docker rename container_name new_container_name

保存

image 的保存和载入。
应用场景是,你要部署的目标机器不能连外网,那么用 docker save 打包,然后拷贝到目标机器上,用docker load 创建镜像。

docker save -o images.tar postgres:9.6 mongo:3.4
docker load -i images.tar # 会覆盖本地镜像库的镜像

container 的保存和导入

docker export -o docker_file.tar my-container-name

docker import docker_file.tar my_new_image
# 导入后成为一个新的 image,这个 image 名为 my_new_image

镜像

列出已经安装的镜像

docker image ls # 显示顶层镜像
docker image ls -a #显示包括中间层在内的所有镜像
# 从远端下载镜像
docker pull <image name>

# 删除指定镜像(删除镜像前须先停止并删除容器)
docker image rm [镜像]
docker commit [选项] [容器名] # 将容器的存储层保存为镜像。慎用,因为很多文件被添加进来,导致镜像极为臃肿
docker history [容器名] # 查看镜像的历史记录

定制镜像:Dockerfile

在空目录中建立一个文本文件,命名为Dockerfile

# 基于ubuntu镜像作为基础镜像
FROM ubuntu:latest

# 维护者信息
MAINTAINER Your Name <your.email@example.com>

# 安装依赖软件包
RUN apt-get update && apt-get install -y \
    software-package1 \
    software-package2 \
    && rm -rf /var/lib/apt/lists/*

# 复制文件到镜像中
COPY ./app /app

# 设置工作目录
WORKDIR /app

# 定义环境变量
ENV ENV_VARIABLE_NAME value

# 运行命令
CMD ["command", "arg1", "arg2"]
  • 每个RUN会建立一层,所以注意尽量用一个RUN,并且用&&把多个SHELL命令串联起来

然后执行合格制作镜像

docker build -t <镜像名称> <Dockerfile路径>

实战:

FROM ubuntu:latest

MAINTAINER guofei9987 <me@guofei.site>

RUN apt-get update \
    && apt-get install -y sudo \
    && sudo apt update

# C 语言
RUN sudo apt install -y gcc make

# Java
RUN sudo apt install -y default-jdk

# Python
RUN sudo apt install -y python3 python3-pip
    
# Rust
RUN sudo apt install -y curl \
    && (curl --proto '=https' --sv1.2 -sSf https://sh.rustup.rs | sh -s -- -y) \
    && source $HOME/.cargo/env

说明

  • 网络不太好的话,很难一次跑出来
  • 可以用 && 把所有的命令粘起来,以节省存储空间
# 制作镜像
docker build --no-cache -t my_img ./
# --no-cache 禁用缓存,在网络不好的时候可以选用

查看安装情况

gcc --version
make --version

java -version

python3 --version
pip --version

cargo --version

Docker Hub

https://cloud.docker.com

docker login # 登入
docker logout # 登出

docker search <name> #搜索
# 例如 docker search mysql 可以搜索所有mysql关键词
# 单个单词得镜像是官方镜像,guofei9987/mysql 是用户做的镜像

推送镜像

docker tag ubuntu guofei9987/ubuntu
docker push guofei9987/ubuntu

常用

清除全部container

docker container rm -f $(docker container ls -aq)

基础 linux

docker run -it --volume ${HOME}:${HOME} ubuntu bash

# 安装常用工具
apt-get update
apt-get install sudo
apt install tree

# 解决中文乱码问题
export LANG="zh_CN.UTF-8"
. /etc/profile

Anaconda

docker run -it --volume ${HOME}:${HOME} continuumio/anaconda3 bash

# 把本机的设置黏贴到docker中
cp /Users/guofei/.gitconfig ~/.gitconfig
cp -a /Users/guofei/.ssh ~/.ssh

jekyll

docker run --rm --label=jekyll --volume /Users/guofei/github/guofei9987.github.io:/srv/jekyll/blog_md_dir -it -p 127.0.0.1:4006:4000 jekyll/jekyll jekyll serve --force_polling --destination /srv/jekyll/blog --source /srv/jekyll/blog_md_dir

mysql

docker run --name=mysql1 -d mysql/mysql-server

# 获得初始密码:
docker logs mysql1
docker logs mysql1 2>&1 | grep GENERATED

docker exec -it mysql1 mysql -uroot -p

# 第一次使用,需要改密码
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

一些语言

# rust
docker run -it --volume ${HOME}:${HOME} rust bash 
docker run -it --volume ${HOME}:${HOME} --platform=linux/amd64 rust bash 

# java
docker run -it --volume ${HOME}:${HOME} --platform=linux/amd64 maven bash 
# amd64 又称为 x86-64 或 x64,是最常见的
# 相比之下,MacBook 的 M 系列芯片是 arm 架构

参考资料

https://blog.csdn.net/liukuan73/article/details/78089138/


您的支持将鼓励我继续创作!