Docker日常笔记

2015-12-02

安装

Ubuntu 22.04 安装

1、删除安装过的docker:

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done

2、安装依赖:

apt-get update
apt-get install ca-certificates curl gnupg

3、添加仓库:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

4、安装docker-ce

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5、配置镜像源 (每次更新配置文件需重启)

vi /etc/docker/daemon.json

{
        "iptables": false,
        "registry-mirrors": [
                "https://docker.m.daocloud.io",
                "https://xxxxxx.mirror.aliyuncs.com",
                "https://docker.kubesre.xyz"
        ]
}

5、重启服务进程

systemctl start docker

默认安装:

apt install docker.io
apt install docker-compose

使用国内加速源

默认情况下,Docker 会使用以下配置文件:

Linux: /etc/docker/daemon.json
Windows: C:\ProgramData\Docker\config\daemon.json

将镜像加速地址加入到你的Docker配置文件/etc/docker/daemon.json中

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拉镜像走代理(如果走国内加速建议关闭):

$ cat /etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://localhost:10809"
Environment="HTTPS_PROXY=http://localhost:10809"

$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://localhost:10809 HTTPS_PROXY=http://localhost:10809
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

私有阿里源: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

quay.io等的国内镜像源记录

docker.io       docker.m.daocloud.io
gcr.io          gcr.m.daocloud.io
ghcr.io         ghcr.m.daocloud.io
k8s.gcr.io      k8s-gcr.m.daocloud.io
registry.k8s.io k8s.m.daocloud.io
quay.io         quay.m.daocloud.io

常见镜像仓库

docker.io:Docker Hub 官方镜像仓库,也是 Docker 默认的仓库
gcr.io、k8s.gcr.io:谷歌镜像仓库
quay.io:Red Hat 镜像仓库
ghcr.io:GitHub 镜像仓库

常见镜像源

中国区官方镜像: https://registry.docker-cn.com
中科大源: https://docker.mirrors.ustc.edu.cn
腾讯源: https://mirror.ccs.tencentyun.com
网易源: http://hub-mirror.c.163.com
中科大镜像地址:http://mirrors.ustc.edu.cn/
Azure中国镜像地址:http://mirror.azure.cn/
DockerHub镜像仓库: https://hub.docker.com/ 
RedHat镜像仓库: https://quay.io/repository/ 
RedHat镜像仓库: https://access.redhat.com/containers

配置1 (修改完配置记得重启docker进程)

{
  "registry-mirrors": ["https://reg-mirror.qiniu.com"]
}

配置2 (修改完配置记得重启docker进程)

{
	"registry-mirrors": ["https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://docker.m.daocloud.io"]
}

Dockerfile

Debian替换国内源

RUN sed -i -r 's#http://deb.debian.org#https://mirrors.aliyun.com#g' /etc/apt/sources.list

Docker可视化工具

Portainer

创建一个Portainer专用的卷,然后在8000和9000端口创建容器并运行:

$ docker volume create portainer_data
$ docker run --name portainer -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

然后在浏览器打开对应地址。第一次运行的时候需要设置账号,然后选择要管理的Docker主机。

LazyDocker

LazyDocker是基于终端的一个可视化查询工具,支持键盘操作和鼠标点击。

Docker 卷管理

官方文档:https://docs.docker.com/storage/volumes/

CentOS 7 安装docker-ce

先去这里下载rpm包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

然后安装:

yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm

docker-composer安装则根据官方推荐的方式安装:https://docs.docker.com/compose/install/#install-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

国内用户 kali-rolling 快速安装docker-ce

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/docker-ce/linux/debian/ stretch stable" >> /etc/apt/sources.list
apt update 
apt install docker-ce

快速拉一个镜像下来

docker pull reg.qiniu.com/library/mongo

运行中容器配置位置

/var/lib/docker/containers/<conainerID>

运行示例:

docker run \
-p 5211:22 \
-p 5212:80 \
-p 5213:6379 \
-p 5214:443 \
-p 5215:21 \
-p 5216:23 \
-p 5217:3306 \
-p 5218:27017 \
-p 5219:9200 \
-p 5220:9300 \
-p 5221:5221 \
-p 5222:5222 \
-p 5223:5223 \
-e ROOT_PASS=password \
-e MYSQL_PASS=password \
-v /home/workspace/malu/docker/app:/app \
-h lamp \
--name lamp \
-d malu.me/malu/docker_lamp:master

参数说明:

-p   端口映射
-e   环境变量
-v   卷挂载点
-h   主机名
--name   容器名称
-d   后台运行

-P 参数: 将dockerfile中EXPOSE指令指定的端口(容器内端口)对本地宿主机公开,并随机绑定到本地宿主机的端口上。

部署示例

influxdb

docker run -p 8086:8086 -v /app/data/influxdb:/var/lib/influxdb2 influxdb

OLD

快速安装

apt-get -y install docker.io

升级Docker

sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker

从本地提交镜像

1. 登录私有镜像仓库
docker login -u [用户名] -p [密码] -e [电子邮件] https://xxx.com
2. 给本地host的镜像打tag
docker tag [镜像ID] xxx.com/[用户名]/[镜像名称:标签]
3. 推送镜像到私有仓库
docker push xxx.com/[用户名]/[镜像名称:标签]

查看镜像

docker images

删除镜像

docker rmi [镜像名称:标签]

删除容器

docker rm [容器ID]
docker rm -f [容器ID]   #强制删除运行中的容器
docker ps -a -q|xarge docker rm   #删除所有不在运行的容器

拉取镜像

docker pull [镜像路径]

登录daocloud帐号:

docker login daocloud.io

运行镜像:

docker run -d -p [外网端口]:[镜像端口] -e [环境变量] [镜像ID]

查看运行中的docker:

docker ps

查看所有启动过的docker:

docker ps -a

停止/启动docker:

docker stop  [docker运行ID]
docker start [docker运行ID]

启动已经关闭的容器(以交互模式启动,有些没有守护的容器可以用这种方式启动)

docker start -ia [docker运行ID]

登录容器:

docker exec -it [container_id] /bin/bash

查看容器日志:

docker logs [docker运行ID]

查看容器运行信息:

docker inspect [docker运行ID]

查看容器资源占用信息:

docker stats [docker运行ID]

查看正在运行容器端口映射情况:

docker port NAME

添加新用户:

useradd -r -m -s /bin/bash

删除docker0网卡

虚拟网卡docker0其实是一个网桥,如果想删除它,只需要按照删除网桥的方法即可。

ifconfig docker0 down
brctl delbr docker0

docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。

在启动时不创建网桥:

docker -d --bridge=none 

开启docker远程API

1.编辑配置文件

vim /etc/default/docker

DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:5000'

比如我开放5000端口

2.重启docker

service docker restart

3.通过接口查看所有容器运行状态

http://localhost:5000/containers/json?all=1

更多接口使用,参考官方文档

给运行中容器添加端口:

获得容器IP,将container_name 换成实际环境中的容器名

docker inspect 'container_name' | grep IPAddress

iptable转发端口,将容器的8000端口映射到Docker主机的8001端口

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000

查看iptables映射情况:

iptables -t nat -L

只查看DOCKER链并显示规则编号:

iptables -L DOCKER --line-numbers -n -t nat

删除(其中5就是规则编号):

iptables -D DOCKER 5 -t nat

也可以commit一个出来,再重新运行

docker commit 示例

docker commit [docker运行ID] reg.qiniu.com/malu/docker_base:ffmpeg-2

32位系统部署Docker

由于Docker Hub Registry上面的镜像都是64位的,所以这里需要自己做一个Ubuntu的镜像,这里使用import命令,该命令的官方解释为:Create a new filesystem image from the contents of a tarball.这里使用openVZ的模板来创建.

openVZ模板的下载地址为:http://openvz.org/Download/templates/precreated

执行导入:

wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04

也可以直接导入:

docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz

接下来就可以运行了:

docker run -i -d ubuntu:14.04 -t /bin/bash

然后可以根据需要自己构建(进入Dockerfile目录):

docker build -t malu/docker_lamp .

基于32位的镜像生成新的镜像,期间如果构建出错可以修改Dockerfile再次构建,默认会调用缓存。

重命名镜像tag

docker run -d [镜像ID] -t /bin/bash    #先启动一个
docker commit -a 'aa' [容器ID] ubuntu:first    #然后把它提交成新镜像

这样就新生成了一个镜像:

root@ACER-mini:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              first               a70f0f795d4b        5 seconds ago       205.2 MB
ubuntu              14.04               65161a7b2077        3 hours ago         205.2 MB

当然上面的方法很傻,其实我们只要:

docker tag imageid name:tag   #新建tag
docker rmi name:oldtag    #删除原来tag

备份迁移

打包成tar

docker save -o filename.tar [镜像ID]

恢复打包文件

docker load -i filename.tar

重命名容器名:

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            goofy_stallman      
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie       
root@ubuntu:~# docker rename goofy_stallman one
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            one                 
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie 

aufs文件系统安装

http://cloud.51cto.com/art/201412/461261.htm

生成requirements.txt文件:

pip install redis
pip freeze > requirements.txt

docker容器故障致无法启动解决办法

首先通过启动日志查看问题原因:

docker logs [docker运行ID]

然后根据问题,到启动数据/var/lib/docker/aufs/diff/路径下。

比如我遇到Nginx启动失败,那就查找nginx配置文件:

root@ubuntu:/var/lib/docker/aufs/diff# find ./ -name 'nginx.conf'
./399145668ccb628a0a9cc572431b93c17a72f84625d8430d9897fd46e572f4dd/etc/nginx/nginx.conf
./0609441079c15cc8214d1f55bdcdb270da9b94008e4432f81d98a96460f54f25/etc/nginx/nginx.conf

然后去修改对应问题。

参考文档:http://dockerpool.com/static/books/docker_practice/index.html

新浪SEC安装docker环境

以下是安装记录

yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install docker-io

yum upgrade device-mapper-libs 

sudo groupadd docker

sudo usermod -a -G docker $USER 

service docker start

chkconfig docker on

docker -d

docker images

sudo docker info

建立网桥

docker network create -d bridge --gateway=192.168.0.1 --subnet=192.168.0.1/24 mybridge

docker-compose

快速安装:

pip install docker-compose

docker-compose.yml Example:

version: '2'
services:
        python:
                image: reg.qiniu.com/pub/docker_base:python-2
                ports:
                        - "50100:22"
                        - "52100-52200:5100-5200"
                volumes:
                        - /home/malu/python/app:/app
                container_name: python
                hostname: python
                command: 
                        - /bin/bash
                        - -c
                        - |
                          cron
                          /usr/sbin/sshd -D
networks:
  default:
    driver: bridge                
    ipam:                         
      driver: default           
      config:                       
        - subnet: 172.19.0.0/16

Docker的Web管理平台portainer (https://portainer.io) docker-compose.yml:

portainer:
  restart: always
  image: portainer/portainer
  ports:
    - "11110:9000"
  command: -H unix:///var/run/docker.sock
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./data:/data
  container_name: portainer

Docker-registry仓库 docker-compose.yml:

registry:
  restart: always
  image: registry:2
  ports:
    - 11111:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/malu.me.crt
    REGISTRY_HTTP_TLS_KEY: /certs/malu.me.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - ./data:/var/lib/registry
    - ./certs:/certs
    - ./auth:/auth
  container_name: registry

Docker-registry仓库Web管理平台(https://github.com/mkuchin/docker-registry-web) docker-compose.yml:

registry-web:
    restart: always
    image: hyper/docker-registry-web
    ports:
      - 11112:8080
    volumes:
       - ./conf:/conf:ro
       - ./db:/data
    container_name: registry-web

conf/config.yml

registry:
   url: http://registry:5000/v2
   name: localhost:5000
   readonly: false
   auth:
     enabled: false

官方安装文档:https://docs.docker.com/compose/install/

安装:

curl -L --fail https://github.com/docker/compose/releases/download/1.14.0/run.sh > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

如果提示版本不匹配,docker最新版本安装

apt-get update
apt-get install -t wheezy-backports linux-image-amd64
curl -sSL https://get.docker.com/ | sh

docker-compose 命令

docker-compose up    # 重新构建并在 Compose 中运行应用
docker-compose up -d # 后台启动
docker-compose stop  # 停止
docker-compose down --volumes # 你可以停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除 Redis 容器中所使用的数据卷。

docker-compose其他标签:

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /app

domainname: malu.me
hostname: malu
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

中文输入乱码,查看乱码解决

docker run env LANG=C.UTF-8 

然后在docker启动文件.bashrc里加上

export LC_ALL=C.UTF-8