docker离线安装并导入镜像
1、下载docker安装文件
离线安装docker,需要下载docker的安装文件。
地址:https://download.docker.com/linux/static/stable/x86_64/
下载兼容的或者最新的docker安装包.
2、离线docker安装
将安装包文件上传到服务器目录并解压。
docker解压到自己随意指定目录即可
- [root@iZbp13sno1lc2yxlhjc4b3Z ~]#tar -xvf docker-19.03.6.tar
将docker注册为service,直接在/etc/systemd/system目录下创建docker.service文件,并把下面内容复制到这个docker.service文件中,然后保存就可以了
[root@iZbp13sno1lc2yxlhjc4b3Z ~]#vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
添加文件权限并启动docker,执行如下命令:
chmod +x /etc/systemd/system/docker.service #添加文件权限
systemctl daemon-reload #重载unit配置文件
systemctl start docker #启动
Docker systemctl enable docker.service #设置开机自启
验证docker安装是否成功:
systemctl status docker #查看Docker状态
docker -v #查看Docker版本
3、离线镜像文件导入
内网环境没法pull镜像,但是docker本身可以将已有的镜像导出成tar文件,并且可以再次导入到docker,利用这一点,可以实现离线镜像文件的下载。
找一台可以联网的docker机器,并pull下载需要的镜像文件。
3.1:然后使用如下命令将镜像文件导出:
docker save java:8 -o java.tar #将java 8的镜像导出成tar文件,java是镜像名称,8是版本号。
docker save reids:8 -o redis.tar #将redis 8的镜像导出成reids.tar文件
3.2:将打包好的tar文件用Xftp软件上传到内网docker服务器,使用如下命令导入镜像文件:
docker load -i java.tar #java.jar是上面3.1外网打包好的jar包
3.3:查看导入的镜像文件:
[root@iZbp13sno1lc2yxlhjc4b3Z ~]# docker images REPOSITORY
TAG IMAGE ID CREATED SIZE java
8 d23bdf5b1b1b 3 years ago 643MB
docker部署nginx并且挂载文件夹和文件
命令可以进入镜像中:
docker run -i -t nginx /bin/bash #docker exec -it 镜像名称bash 查看镜像命令:docker images
命令可以进入容器中:
docker exec -it nginxs bash #docker exec -it 容器名称bash 查看容器命令:docker ps -a
镜像中nginx的文件位置(容器中的位置一致);
找到镜像中nginx.conf配置文件路径/etc/nginx/nginx.conf
找到default.conf配置文件的路径/etc/nginx/conf.d/default.conf
找到默认首页文件夹html路径/usr/share/nginx/html
找到日志文件路径/var/log/nginx
在linux系统中创建挂载源文件和文件夹,可以在宿主系统中创建这些文件,方便等会直接把容器中的文件挂在到宿主系统中。
mkdir -p /data/nginx/conf
mkdir -p /data/nginx/conf.d
mkdir -p /data/nginx/html
mkdir -p /data/nginx/logs
然后创建在conf文件夹里面创建一个nginx.conf配置文件,并且输入一下内容,建议大家不要照抄我的配置,用我上面介绍的第一步的方法进入到nginx容器的终端中复制nginx.conf配置文件的内容到linux系统中这个新创建的nginx.conf文件中进行修改,这样子就保证了配置文件中的路径与镜像中配置文件的路径能保持一致
[root@docker2 /]# cd /data/nginx/conf
[root@docker2 conf]# more nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
在conf.d里面创建一个default.conf文件,并且输入一下内容,同样这个内容也是我从镜像中default.conf默认的配置文件中复制过来修改的,同样建议大家不要照抄我的内容,因为涉及到路径那些可能会与你们nginx镜像中的路径不一致,这样子在启动镜像创建容器的时候就无法用挂载的方法覆盖掉容器中的路径
[root@docker2 conf]# more /data/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index 1.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
大家注意了,这里我修改了一下原来默认配置文件里面的内容,在上面的其中一个location中,我把nginx默认首页index改成了1.html,1.html是我自己创建的首页名
在html文件夹下创建1.html首页文件,并且编写属于自己的首页,这里我是用notepadd++在windows上面写好了1.html文件再通过工具拷过去linux系统里面的,注意有中文的可能要转换下编码,不然可能会乱码,例如我这里用的是ansi的编码
<html>
<head>
<title>Mynginx</title>
</head>
<body>
<h1>
欢迎使用nginx!
</h1>
</body>
</html>
启动一个名为nginx81(名字自己根据需求起名字,一般见名知意即可) 的容器
docker run --name nginx81 -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html nginx
默认容器对这个目录有可读写权限,可以通过指定ro,将权限改为只读(readonly)
docker run --name my-nginx -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html:ro -d nginx
[root@docker2 conf]# docker run --name mynginx -d -p 80:80
-v /data/nginx/html:/usr/share/nginx/html
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
-v /data/nginx/logs:/var/log/nginx nginx
宿主机和容器之间文件拷贝
1、从容器里面拷文件到宿主机?
答:在宿主机里面执行以下命令
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,
现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?
答案:在宿主机上面执行命令
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
2、从宿主机拷文件到容器里面
答:在宿主机里面执行如下命令
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
示例:假设容器名为nginx,现在要将宿主机/opt/skyvis/nginx/html文件拷贝到容器里面的/usr/share/nginx路径下面,那么命令该怎么写呢?
答案:在宿主机上面执行如下命令
docker cp /opt/skyvis/nginx/html nginxs:/usr/share/nginx
3、在这里在记录一个问题,怎么看容器名称?
执行命令:docker ps,出现如图所示,其中NAMES就是容器名了。