docker使用

安装docker

参考arch wiki和docker的weiki:

安装和卸载:
		$ sudo pacman -S docker
		Arch 启动Docker
		Arch 下面是使用systemd来管理服务的,可以用systemctl命令来启动docker服务。
		$ sudo systemctl start docker
		如果想设置docker在arch下面开机自动启动,可以用下面的命令:
		$ sudo systemctl enable docker
		Arch下面删除Docker
		删除Docker包。
		$ sudo pacman -R docker
		删除Docker包,同时删除其依赖的包。
		重启docker
		systemctl restart docker
		删除Docker运行过程中产生的镜像、容器等文件。用户生成的配置文件需要手工删除。
		$ rm -rf /var/lib/docker

china

Docker 官方中国区
https://registry.docker-cn.com

网易
http://hub-mirror.c.163.com

ustc
https://docker.mirrors.ustc.edu.cn

$ docker --registry-mirror=https://registry.docker-cn.com daemon

OR

nano /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

#修改保存后重启 Docker 以使配置生效
systemctl restart docker

运行centos容器

安装centos:
		sudo docker pull centos
		开启容器:
		-p端口映射
		-d后台运行
		-v目录映射 本地数据:容器数据
		docker run -p 80:80 -p 8888:8888 -i -d -v /opt/centos:/centos -t centos /bin/bash
		进入:
		docker exec -it containerId bash
		停止:
		docker stop containerId // containerId 是容器的ID

使用docker环境搭建lamp环境

lamp和资源文件全部映射到物理机 lamp环境使用bitnami-lampstack-7.1.19-1-linux-x64-installer.run 安装lamp选择安装到/centos/lampstack-7.1.19-1

docker run -p 80:80 -p 3306:3306 -i -d -v /home/lxx/centos:/centos -t centos /bin/bash

进入

docker exec -it CID bash

进入/centos/lampstack-7.1.19-1(即物理机/home/lxx/centos) mysql默认端口3306

./ctlscript.sh ?
usage: ./ctlscript.sh help
       ./ctlscript.sh (start|stop|restart|status)
       ./ctlscript.sh (start|stop|restart|status) mysql
       ./ctlscript.sh (start|stop|restart|status) apache

help       - this screen
start      - start the service(s)
stop       - stop  the service(s)
restart    - restart or start the service(s)
status     - show the status of the service(s)

进入phpmyadmin

phpmyadmin.example.com

如果docker启动失败提示:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/vhs/mysql-8.0.11-0/mysql/tmp/mysql.sock' (2)

解决方案(不一定有效)

#文件/vhs/mysql-8.0.11-0/mysql/tmp/mysql.sock.lock被锁住了,改为/vhs/mysql-8.0.11-0/mysql/tmp/mysql.sock
mv /vhs/mysql-8.0.11-0/mysql/tmp/mysql.sock.lock /vhs/mysql-8.0.11-0/mysql/tmp/mysql.sock
#启动
/vhs/mysql-8.0.11-0/mysql/bin/mysqld --user=root
/vhs/mysql-8.0.11-0/ctlscript.sh start mysql

打包自己的docker镜像环境包,导入导出

打包

docker commit 5577a1aad419  lxx/kangle:001

下次直接运行

docker run -p 80:80 -p 3311:3311 -p 8888:8888 -p 3306:3306 -i -d -v /home/lxx/centos:/vhs -t f4c4a6eec9c8 /bin/bash

删除镜像(先删除容器)

docker rm continnorID

删除容器记录

docker ps -a
docker ps -a|awk '{print $1}'|xargs docker rm
docker rmi imagesID

将镜像保存为本地文件

 docker save imageID -o ./ct.tar

加载刚才本地tar文件

docker load -i ./ct.tar

重命名镜像名称

docker tag eb40dcf64078 lxx/kangle:001
  • 复制文件

docker cp [file] [container_name]:[container_path]
docker cp ./cemu-2.0-4-ubuntu-20.04-x64.zip x112:/opt/
  • win使用nerdctl管理docker_host

https://github.com/containerd/nerdctl
  • centos7安装最新的docker

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce docker-ce-cli containerd.io
  • 从二进制安装最新docker

export DOCKER_HOST=tcp://0.0.0.0:39012
sudo apt install iptables
# 资源目录
https://download.docker.com/linux/

# wget https://download.docker.com/linux/static/stable/x86_64/docker-29.3.0.tgz
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-29.3.0.tgz
# wget https://mirror.sjtu.edu.cn/docker-ce/linux/static/stable/x86_64/docker-29.3.0.tgz
tar xf docker-29.3.0.tgz
# 如果是升级需要停止docker和containerd服务并替换文件
cp docker/* /usr/bin/
cat >/etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target


[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
TasksMax=infinity
OOMScoreAdjust=-999


[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now containerd.service
cat > /etc/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service


[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:39012 --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500


[Install]
WantedBy=multi-user.target
EOF
# 准备docker的socket文件
cat > /etc/systemd/system/docker.socket <<EOF
[Unit]
Description=Docker Socket for the API


[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker


[Install]
WantedBy=sockets.target
EOF
# 创建docker组
groupadd docker
systemctl daemon-reload
# 启动docker
systemctl enable --now docker.socket
systemctl enable --now docker.service
# 验证
docker info
# 创建docker配置文件
mkdir -p /etc/docker/

cat >/etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.2011101.xyz"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF
systemctl restart docker

# 运行失败检查错误日志
journalctl -u docker.service --no-pager|grep failed
  • 二进制安装 docker-compose

wget https://github.com/docker/compose/releases/download/v5.1.2/docker-compose-linux-x86_64
mkdir -p $HOME/.docker/cli-plugins/
cp ./docker-compose-linux-x86_64 $HOME/.docker/cli-plugins/docker-compose
# 使用
docker compose

# OR
cp ./docker-compose-linux-x86_64 /usr/bin/docker-compose
# 使用
docker-compose
  • 删除none镜像

docker images -f "dangling=true"
docker images -f "dangling=true" -q|xargs docker rmi

# 状态
docker system df
# 删除未使用的镜像,清理
# docker system prune -a --force
docker system prune
docker builder prune -f
  • 迁移docker数据目录

sudo systemctl stop docker

sudo mkdir -p /home/.dockerdata
sudo mv /var/lib/docker /home/.dockerdata

# 创建软件链接
sudo ln -s /home/.dockerdata/docker /var/lib/docker

sudo systemctl start docker
  • 磁盘占用分析doku

docker run --name doku -d -v /var/run/docker.sock:/var/run/docker.sock:ro -v /:/hostroot:ro -p 9090:9090 amerkurev/doku
  • phpmyadmin使用和配置,无须密码直接登录

  phpmyadmin:
    image: registry.cn-hangzhou.aliyuncs.com/jcleng/library-phpmyadmin:latest
    ports:
      - 3001:80
    environment:
      PMA_ARBITRARY: 1
      MEMORY_LIMIT: 1024M
      UPLOAD_LIMIT: 1024M
      MAX_EXECUTION_TIME: 36000
    volumes:
      - "./config.user.inc.php:/etc/phpmyadmin/config.user.inc.php"
docker run -itd \
  --name phpmyadmin \
  -p 8080:80 \
  -e PMA_ARBITRARY=1 \
  -e MEMORY_LIMIT=1024M \
  -e UPLOAD_LIMIT=1024M \
  -e MAX_EXECUTION_TIME=36000 \
  registry.cn-hangzhou.aliyuncs.com/jcleng/library-phpmyadmin:latest
// 无须密码直接登录
$i = 1;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['host'] = '106.1.*.191';
$cfg['Servers'][$i]['user'] = 'sjdaj***sdsds';
$cfg['Servers'][$i]['password'] = 'pass***word!!';
$cfg['Servers'][$i]['AllowNoPassword'] = true;

$i = 2;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['host'] = '106.1.*.191';
$cfg['Servers'][$i]['user'] = 'sjdaj***sdsds';
$cfg['Servers'][$i]['password'] = 'pass***word!!';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
  • erikdubbelboer-phpredisadmin

  redisadmin:
    image: registry.cn-hangzhou.aliyuncs.com/jcleng/phpredisadmin
    privileged: true
    ports:
    - 6380:80
    volumes:
      - "./config.redis.php:/src/app/includes/config.inc.php"

config.redis.php文件

<?php
include 'config.sample.inc.php';
$config['servers'] = array();
//
$config['servers'][] = array(
    'name' => 'local_redis',
    'host' => 'redis',
    'port' => '6379',
    'auth' => null
);
$config['max_tree_num'] = 10;
// 设置授权登录
$config['login'] = array(
    'admin888' => array(
        'password' => 'password888',
    ),
);
function print_namespace($item, $name, $fullkey, $islast) {
      global $config, $server, $redis;
+      if (count($item) > $config['max_tree_num']) {
+        $is_morre = '/' . count($item);
+        $item = array_slice($item, 0, $config['max_tree_num']);
+      } else {
+        $is_morre = '';
+      }

-        <a href="?view&amp;s=<?php echo $server['id']?>&amp;d=<?php echo $server['db']?>&amp;key=<?php echo urlencode($fullkey)?>" title="<?php echo format_html($name)?>"><?php echo format_html($name)?><?php if ($len !== false) { ?><span class="info">(<?php echo $len?>)</span><?php } ?></a>
+        <a href="?view&amp;s=<?php echo $server['id']?>&amp;d=<?php echo $server['db']?>&amp;key=<?php echo urlencode($fullkey)?>" title="<?php echo format_html($name)?>"><?php echo format_html($name)?><?php if ($len !== false) { ?><span class="info">(<?php echo $len . $is_morre?>)</span><?php } ?></a>

-<div class="icon"><?php echo format_html($name)?>&nbsp;<span class="info">(<?php echo count($item)?>)</span>
+<div class="icon"><?php echo format_html($name)?>&nbsp;<span class="info">(<?php echo count($item) . $is_morre?>)</span>
  • 通过进程id找到docker

cat /proc/426916/cgrou
# 0::/system.slice/docker-10d4df7b1279287324583e7f664512c55d42f38a87b5d3383a3661e583ebdec5.scope
docker inspect 10d4df7b1279287324583e7f664512c55d42f38a87b5d3383a3661e583ebdec5|grep -C 3 "Name"
# 查看父级进程, 和NAME
cat /proc/380354/status|grep -C 20 PPid