This is an old revision of the document!
# Docker简介
## 新服务器安装Docker及容器
* 安装Docker * Docker配置 * 创建Dockerfile * 通过Dockerfile生成镜像 * 基于镜像生成容器
# Docker安装
## Docker for Windows
* Windows版本要求:Win10,64位,Pro/Enterprise/Education版,1607以上版本 * 需要打开Hyper-V * 下载Docker for Windows然后打开下载的文件按照提示安装即可
## Docker CE for Ubuntu
参考[Docker CE for Ubuntu官方文档](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/)
* Ubuntu版本:64位,14.04/16.04/17.04/17.10以上版本 * 设置Ubuntu源
```bash sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \
stable"
``` * 安装DockerCE ```bash sudo apt-get update sudo apt-get install docker-ce ``` * 验证安装是否成功 ```bash sudo docker run hello-world ``` ## Docker CE for CentOS (通过yum安装) 参考[Docker CE for CentOS官方安装文档](https://docs.docker.com/engine/installation/linux/docker-ce/centos/) * 安装需要的其他程序 ```
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
``` * 配置Docker到yum库 ```
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
``` * 安装Docker ```
sudo yum install docker-ce
``` * 启动Docker ```
sudo systemctl start docker
``` ## Docker Toolbox ## Docker for ArchLinux ```bash # Arch源自带docker安装包,所以直接使用pacman就可以安装 sudo pacman -Sy docker ``` # Docker配置 ## Docker国内镜像加速 参考[Docker中国镜像加速](https://www.docker-cn.com/registry-mirror) 在`/etc/docker/daemon.json`(如果没有该文件则创建该文件)中添加如下内容: ```json {
"registry-mirrors": ["https://registry.docker-cn.com"]
} ``` 如果是阿里云服务器,建议使用阿里云镜像加速,具体见https://www.jianshu.com/p/1a4025c5f186 ## Docker for Linux安装后配置 ### 非root用户使用Docker 如果将当前用户添加到docker用户组: ```
sudo usermod -aG docker $USER
``` 如果将其他用户添加到docker用户组: ```
sudo usermod -aG docker <user_name>
``` # Docker常用操作 ## Docker操作流程 * 获取镜像:可以通过`docker pull <image_author>/<image_name>`拉取已有镜像,也可以通过`docker build -t <image_name> .`通过Dockerfile生成镜像 * 生成容器:`docker run –name <container_name> -p <host_port>:<container_port> -dit <image_name>[:image_version]` * 发布镜像:`docker commit [-m <message>] <container_name> <image_name>[:image_version]`, `docker push <username>/<image_name>[:tag]` ## Docker镜像操作 * 查看镜像:`docker images`, `docker images -as` * 删除镜像:`docker rmi <username>/<image_name>` * 导出镜像:`docker save -o <image_file_path> <image_name>` * 导入镜像:`docker load -i <image_file_path>` ## Docker容器操作 * 查看容器:`docker container`或`docker ps`,`docker ps -a`(查看所有容器,包括已经停止的容器), `docker ps -as`(查看所有容器并显示容器占用的空间大小) * 停用容器:`docker stop <container_name_or_container_id>` * 启动容器:`docker start <container_name_or_container_id>` * 删除容器:`docker rm <container_name_or_container_id>` ## Docker复制操作 * 系统复制到容器:`docker cp <系统文件路径> <容器>:<容器路径>` * 容器复制到系统:`docker cp <容器>:<文件路径> <系统路径> ` * 容器之间不能相互copy # Dockerfile Java Web示例: ```bash # 基于Uuntu16.04 FROM ubuntu:16.04
# 避免安装软件提示dpkg配置错误 ARG DEBIAN_FRONTEND=noninteractive # 支持显示中文 ENV LANG C.UTF-8
# 切换Ubuntu源为中国的源 RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install -y –no-install-recommends apt-utils RUN apt-get install -y –no-install-recommends bash-completion RUN apt-get install -y –no-install-recommends apt-transport-https ca-certificates RUN apt-get install -y –no-install-recommends vim openssh-server wget # 安装tomcat和mysql等 RUN apt-get install -y –no-install-recommends git maven openjdk-8-jre openjdk-8-jdk RUN apt-get install -y –no-install-recommends mariadb-server mariadb-client tomcat8
# 修改maven镜像 RUN wget -q https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war RUN cp jenkins.war /var/lib/tomcat8/webapps
# 修改ssh配置以允许远程登录root用户 RUN sed -i 's/PermitRootLogin\ prohibit-password/PermitRootLogin\ yes/g' /etc/ssh/sshd_config # 配置tomcat内存 RUN sed -i 's/Xmx128m/Xmx4096m/g' /etc/default/tomcat8
# 清理apt缓存 RUN rm -rf /var/cache/apt/archives/*
# 开放端口 EXPOSE 3306 EXPOSE 8080 EXPOSE 80 EXPOSE 22
# 命令行自动补全 RUN echo “if ! shopt -oq posix; then” > ~/.bashrc RUN echo “ if [ -f /usr/share/bash-completion/bash_completion ]; then” » ~/.bashrc RUN echo “ . /usr/share/bash-completion/bash_completion” » ~/.bashrc RUN echo “ elif [ -f /etc/bash_completion ]; then” » ~/.bashrc RUN echo “ . /etc/bash_completion” » ~/.bashrc RUN echo “ fi” » ~/.bashrc RUN echo “fi” » ~/.bashrc
# 自启动脚本 RUN echo “#!/usr/bin/env bash” > ~/start.sh RUN echo “service ssh start” » ~/start.sh RUN echo “service mysql start” » ~/start.sh RUN echo “service tomcat8 start” » ~/start.sh RUN chmod a+x ~/start.sh
# 其他bashrc配置 RUN echo “alias ll='ls -alF'” » ~/.start.sh
CMD ~/start.sh && /bin/bash ``` Django示例 ```bash # 基于Uuntu16.04 FROM ubuntu:16.04
# 避免安装软件提示dpkg配置错误 ARG DEBIAN_FRONTEND=noninteractive # 支持显示中文 ENV LANG C.UTF-8
# 切换Ubuntu源为中国的源 RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install -y –no-install-recommends apt-utils RUN apt-get install -y –no-install-recommends bash-completion RUN apt-get install -y –no-install-recommends apt-transport-https ca-certificates RUN apt-get install -y –no-install-recommends vim openssh-server wget # 安装Apache2, python3等 RUN apt-get install -y –no-install-recommends git apache2 python3 python3-pip libapache2-mod-wsgi-py3 python3-setuptools python3-dev build-essential RUN apt-get install -y –no-install-recommends mariadb-server mariadb-client libmysqlclient-dev
# 清理apt缓存 RUN rm -rf /var/cache/apt/archives/*
# 开放端口 EXPOSE 3306 EXPOSE 8000 EXPOSE 80 EXPOSE 22
# 命令行自动补全 RUN echo “if ! shopt -oq posix; then” > ~/.bashrc RUN echo “ if [ -f /usr/share/bash-completion/bash_completion ]; then” » ~/.bashrc RUN echo “ . /usr/share/bash-completion/bash_completion” » ~/.bashrc RUN echo “ elif [ -f /etc/bash_completion ]; then” » ~/.bashrc RUN echo “ . /etc/bash_completion” » ~/.bashrc RUN echo “ fi” » ~/.bashrc RUN echo “fi” » ~/.bashrc
# 自启动脚本 RUN echo “#!/usr/bin/env bash” > ~/start.sh RUN echo “service ssh start” » ~/start.sh RUN echo “service mysql start” » ~/start.sh RUN echo “service apache2 start” » ~/start.sh RUN chmod a+x ~/start.sh
# 其他bashrc配置 RUN echo “alias ll='ls -alF'” » ~/.bashrc
CMD ~/start.sh && /bin/bash ``` # 常见问题解决 ## 修改已有容器的端口映射 ### 方法一:提交容器为新的镜像,删除原容器后重新创建一个容器,创建时修改端口映射 ### 方法二:直接修改容器的配置文件(Docker version 17.09.0-ce, build afdb6d4测试通过) 参考[Docker Change Port Mapping for an Existing Container](https://mybrainimage.wordpress.com/2017/02/05/docker-change-port-mapping-for-an-existing-container/)(需要自备梯子) * 使用docker inspect命令查看容器的id * **停掉docker服务(这一步非常重要,不能省略)** ``` sudo service docker stop ``` * 修改config.v2.json文件(如果修改已有端口映射可以跳过此步骤) ``` sudo vim /var/lib/docker/containers/<container id>/config.v2.json # 在ExposedPorts中添加类似“8888/tcp”: {} ``` * 修改hostconfig.json文件 ``` sudo vim /var/lib/docker/containers/<container id>/hostconfig.json # 添加或修改PortBindings,类似 “80/tcp”:[{“HostIp”: “”,“HostPort”: “80”}], ``` * 重新启动docker服务 ``` sudo service docker start ``` * 启动docker容器 ``` sudo docker start <container_id_or_container_name> ``` * 启动docker容器内应该启动的程序或者服务(如果需要手动启动的情况下) ## 自动启动容器内的service * Dockerfile方式: 在dockerfile中通过加入`CMD service <service_name> start && /bin/bash`。[参考链接](https://stackoverflow.com/questions/25135897/how-to-automatically-start-a-service-when-running-a-docker-container) * Image方式: 在run image的时候加入需要启动时执行的命令或者脚本即可,如果container已经存在则提交后再run,类似`docker run –name=test -dit ubuntu service <service_name> start && /bin/bash` ## Tomcat在容器内通过service方式启动提示Failed 在执行`docker run`命令时,增加参数`–cap-add SYS_PTRACE` ## 修改Docker镜像和容器文件路径 参考链接:[How to change the docker image installation directory?](https://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory),[How do I change the Docker image installation directory?](https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169) Docker for Linux的镜像和容器文件默认存储在/var/lib/docker文件夹中,可以改为其他路径,修改步骤为 * 停用Docker:`service docker stop` * 备份原文件夹:`tar czf ~/docker.tar.gz /var/lib/docker` * 移动/var/lib/docker文件夹到其他路径(**一定要使用mv命令,而不能cp再删除原文件夹**,否则会出现容器内service start失败):`mv /var/lib/docker ~/` * 修改docker daemon配置,即修改/etc/docker/daemon.json(如果没有则创建该文件),增加`“graph”: “/home/test/docker”`到daemon.json文件中。 * 启用Docker:`service docker start` * 启动容器:`docker start <docker_name>` ## 容器内中文字符无法显示 ### 方法一:`docker run`时增加`-e LANG=C.UTF-8` ### 方法二:Dockerfile中增加`ENV LANG=C.UTF-8`
## Redhat EL 6.8 docker 安装问题